如何解决如何在带有psycopg2的WITH语句公用表表达式中使用命名占位符?
我使用psycopg2连接到postgres数据库。更准确地说,它是Denodo平台上的架构。
当我尝试使用公用表表达式进行数据库查询并使用命名占位符时,出现以下错误:
DatabaseError: Execution Failed on sql 'WITH table as (
SELECT INH_PAR_TECH_ID
FROM tgesges
WHERE PLNK_ID in %(PLNK)s
)
SELECT * FROM table': Syntax error: Exception parsing query near '''
DETAIL: java.sql.sqlException: Syntax error: Exception parsing query near '''
PLNK = ('0000130433','0000130434','0000130296','0000130292','0000130293')
params = {'PLNK':PLNK}
query ="""WITH table as (
SELECT INH_PAR_TECH_ID
FROM tgesges
WHERE PLNK_ID in %(PLNK)s
)
SELECT * FROM table""
conn = psycopg2.connect(user = user,password = password,host = hostname,port = port,dbname = schema)
df = pd.read_sql(sql=query,con=conn,params=params,parse_dates=parse_dates)
conn.close()
query = """
SELECT INH_PAR_TECH_ID as ID
FROM tgesges
WHERE PLNK_ID in %(PLNK)s
"""
conn = psycopg2.connect(user = user,parse_dates=parse_dates)
conn.close()
即使我将查询作为通用表表达式而不使用命名的占位符,查询也不会出现问题:
query = """WITH table as (
SELECT INH_PAR_TECH_ID
FROM tgesges
WHERE PLNK_ID in ('0000130433','0000130293')
)
SELECT * FROM table""
conn = psycopg2.connect(user = user,parse_dates=parse_dates)
conn.close()
有人知道我如何将WITH语句与命名占位符一起使用吗?
感谢您的帮助!
同时,我发现该表是保留字。但是,即使我更改了表的名称,也无法正常工作。这是我使用mogrify时查询的输出:
您是否知道我要更改以摆脱占位符中的字母“ E”?
CODE
PLNK = ("0000130433","0000130434","0000130296","0000130292","0000130293")
params = {'PLNK':PLNK}
query = """\
WITH grundselektion (INH_PAR_TECH_ID,d_min_eroe_sp3,d_start_ru) AS
(
SELECT INH_PAR_TECH_ID,min(EROE_DT),min(EROE_DT) + Interval '-1' YEAR
FROM tgesges
WHERE PLNK_ID in %(PLNK)s
AND mutcd ne 'D'
AND MANDCD = '001'
AND PLNK_ID in %(PLNK)s
GROUP BY INH_PAR_TECH_ID
)
SELECT *
FROM grundselektion AS gsel
"""
conn = psycopg2.connect(user = user,dbname = schema)
cur = conn.cursor()
print(cur.mogrify(query,params).decode('utf-8'))
cur.execute(query,params)
print(cur.fetchall())
OUT
WITH grundselektion (INH_PAR_TECH_ID,min(EROE_DT) + Interval '-1' YEAR
FROM tgesges
WHERE PLNK_ID in (E'0000130433',E'0000130434',E'0000130296',E'0000130292',E'0000130293')
AND mutcd ne 'D'
AND MANDCD = '001'
AND PLNK_ID in (E'0000130433',E'0000130293')
GROUP BY INH_PAR_TECH_ID
)
SELECT *
FROM grundselektion AS gsel
非常感谢和最诚挚的问候 汤姆
解决方法
table
是reserved word,只需重命名变量即可。除此之外,您可以照常使用with
语句:
# PLNK = ('0000130433','0000130434','0000130296','0000130292','0000130293')
PLNK = (1,5,999,1307)
params = {'PLNK':PLNK}
query ="""WITH foo as (
SELECT *
FROM accounts
WHERE id in %(PLNK)s
)
SELECT id FROM foo"""
print(cur.mogrify(query,params).decode('utf-8'))
cur.execute(query,params)
print(cur.fetchall())
出局:
WITH foo as (
SELECT *
FROM accounts
WHERE id in (1,1307)
)
SELECT id FROM foo
[(999,),(1307,)]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。