【问题标题】:Pass Python list as a input to Redshift in SQL在 SQL 中将 Python 列表作为输入传递给 Redshift
【发布时间】:2020-09-14 14:28:17
【问题描述】:

我想提供一个 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 查询。上面的方法我试过了,但是每次尝试都会报错:

Traceback(最近一次调用最后一次):文件“”,第 48 行,in psycopg2.errors.SyntaxError:“{”行处或附近的语法错误 8: {}.format(','.join(list_name);

我无法前进,请帮助

【问题讨论】:

    标签: python sql amazon-redshift psycopg2


    【解决方案1】:

    您的代码中有两个问题:

    • cursor.execute 调用中运行两个单独的 SQL 命令。这是对 Python DB-API 的一种误解,它通常每次执行调用只允许一个命令。
    • 不正确地在字符串中包含format 关键字inside。这是字符串插值的一般 Python 语法问题。具体来说,.format 是一种在字符串上运行的方法。见docs

    考虑分离两个 SQL 语句并正确使用 string.format%s 占位符与 parameterization 进行插值。为了说明,.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() 
    

    【讨论】:

    • 当我尝试上述方法时,我得到了 Traceback(最近一次调用最后):文件“”,第 3 行,在 psycopg2.errors.SyntaxError: INSERT has比目标列更多的表达式
    • 尝试明确指定目标列。请参阅编辑添加列名以追加查询。
    • 实际上,我在所有 VALUES 元组周围还有一对多余的括号。见编辑。
    【解决方案2】:

    不清楚您希望如何插入列表,但让psycopg2/execute 为您格式化查询:

    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)
    

    输出:

    ('HP7CXNGSUFEPZCO4GS5RQPY6XY',)
    ('9475EFWZCNARPEJEZEMXDFHIBI',)
    ('6ECWZUQGEJCR5EZXDH9URCN53M',)
    ('XZ9P6KTDGREM5KIXUO9IHCTKAQ',)
    ('HP7CXNGSUFEPZCO4GS5RQPY6XY,9475EFWZCNARPEJEZEMXDFHIBI,6ECWZUQGEJCR5EZXDH9URCN53M,XZ9P6KTDGREM5KIXUO9IHCTKAQ',)
    ('["HP7CXNGSUFEPZCO4GS5RQPY6XY", "9475EFWZCNARPEJEZEMXDFHIBI", "6ECWZUQGEJCR5EZXDH9URCN53M", "XZ9P6KTDGREM5KIXUO9IHCTKAQ"]',)
    

    注意:
    我不得不更改表名,我的 postgres db 不允许该名称:

    【讨论】:

      猜你喜欢
      • 2022-06-14
      • 1970-01-01
      • 2020-06-21
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      相关资源
      最近更新 更多