将Python列表作为输入传递给SQL中的红移
我想提供一个Python列表将Python列表作为输入传递给SQL中的红移,python,sql,amazon-redshift,psycopg2,Python,Sql,Amazon Redshift,Psycopg2,我想提供一个Python列表 sql_foramt= ['HP7CXNGSUFEPZCO4GS5RQPY6XY', '9475EFWZCNARPEJEZEMXDFHIBI', '6ECWZUQGEJCR5EZXDH9URCN53M', 'XZ9P6KTDGREM5KIXUO9IHCTKAQ'] 作为Python中上述SQL查询的输入 cur.execute("""CREATE TEMP TABLE ##Validation_Marc
sql_foramt= ['HP7CXNGSUFEPZCO4GS5RQPY6XY', '9475EFWZCNARPEJEZEMXDFHIBI',
'6ECWZUQGEJCR5EZXDH9URCN53M', 'XZ9P6KTDGREM5KIXUO9IHCTKAQ']
作为Python中上述SQL查询的输入
cur.execute("""CREATE TEMP TABLE ##Validation_Marc (
Codes varchar(250) );
INSERT INTO ##Validation_Marc
VALUES
{}.format(','.join(list_name);
我正在尝试使用psycopg2
库通过Python运行SQL查询。我尝试过上述方法,但每次尝试都会出现错误:
回溯(最近一次调用):文件“”,第48行,在
psycopg2.errors.SyntaxError:在“{”行或其附近出现语法错误
8:{}.format(','.join(列表名称)
我无法前进,请帮助您的代码中有两个问题:
- 在
调用中运行两个单独的SQL命令。这是对Python DB API的误解,通常每个execute调用只允许一个命令游标.execute
- 在字符串中不正确地包含
关键字。这是字符串插值的一般Python语法问题。具体而言,format
是在字符串上运行的方法。请参阅.format
string.format
插入%s
占位符。为了便于说明,在单独的一行上调用了.format
conn = psycopg2.connect(...)
sql = "CREATE TEMP TABLE ##Validation_Marc ( Codes varchar(250) )"
cur.execute(sql)
conn.commit()
mylist = ['HP7CXNGSUFEPZCO4GS5RQPY6XY', '9475EFWZCNARPEJEZEMXDFHIBI',
'6ECWZUQGEJCR5EZXDH9URCN53M', 'XZ9P6KTDGREM5KIXUO9IHCTKAQ']
sql = "INSERT INTO ##Validation_Marc (Codes) VALUES {}"
cur.execute(query = sql.format(', '.join(['(%s)' for _ in mylist])), # FORMAT PLACEHOLDERS
vars = mylist) # BIND PARAMS
conn.commit()
不太清楚您希望如何插入列表,但让
psycopg2/执行
为您设置查询格式:
import psycopg2
import json
conn = psycopg2.connect("...")
cur = conn.cursor()
sql = "CREATE TEMP TABLE __Validation_Marc ( Codes varchar(250) )"
cur.execute(sql)
mylist = ['HP7CXNGSUFEPZCO4GS5RQPY6XY', '9475EFWZCNARPEJEZEMXDFHIBI', '6ECWZUQGEJCR5EZXDH9URCN53M', 'XZ9P6KTDGREM5KIXUO9IHCTKAQ']
sql = "INSERT INTO __Validation_Marc VALUES (%s)"
# Option1: Insert each code as record set
for value in mylist:
cur.execute(sql, (value, ))
conn.commit()
# Option2: Insert codes as one recordset comma separated
cur.execute(sql, (','.join(mylist),) )
conn.commit()
# Option3: insert as string as it is:
cur.execute(sql, (json.dumps(mylist),) )
conn.commit()
cur.execute("select * from __Validation_Marc")
for row in cur.fetchall():
print(row)
输出:
注意:我必须更改表名,我的postgres db不允许该名称:当我尝试上述方法时,我得到了回溯(最近一次调用last):文件“”,第3行,在psycopg2.errors.SyntaxError中:INSERT比target columnsTry有更多的表达式来显式指定目标列。请参阅编辑添加列名以追加查询。实际上,我在所有
值
元组周围还有一对多余的括号。请参阅编辑。
('HP7CXNGSUFEPZCO4GS5RQPY6XY',)
('9475EFWZCNARPEJEZEMXDFHIBI',)
('6ECWZUQGEJCR5EZXDH9URCN53M',)
('XZ9P6KTDGREM5KIXUO9IHCTKAQ',)
('HP7CXNGSUFEPZCO4GS5RQPY6XY,9475EFWZCNARPEJEZEMXDFHIBI,6ECWZUQGEJCR5EZXDH9URCN53M,XZ9P6KTDGREM5KIXUO9IHCTKAQ',)
('["HP7CXNGSUFEPZCO4GS5RQPY6XY", "9475EFWZCNARPEJEZEMXDFHIBI", "6ECWZUQGEJCR5EZXDH9URCN53M", "XZ9P6KTDGREM5KIXUO9IHCTKAQ"]',)