微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在带有psycopg2的WITH语句公用表表达式中使用命名占位符?

如何解决如何在带有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

非常感谢和最诚挚的问候 汤姆

解决方法

tablereserved 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?