Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Python列表作为输入传递给SQL中的红移_Python_Sql_Amazon Redshift_Psycopg2 - Fatal编程技术网

将Python列表作为输入传递给SQL中的红移

将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

我想提供一个Python列表

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(列表名称)


我无法前进,请帮助

您的代码中有两个问题:

  • 游标.execute
    调用中运行两个单独的SQL命令。这是对Python DB API的误解,通常每个execute调用只允许一个命令
  • 在字符串中不正确地包含
    format
    关键字。这是字符串插值的一般Python语法问题。具体而言,
    .format
    是在字符串上运行的方法。请参阅
考虑分隔两条SQL语句,并正确使用
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"]',)