【问题标题】:pyscopg2: Is it possible to dynamically add %s in looppsycopg2:是否可以在循环中动态添加 %s
【发布时间】:2020-09-07 09:02:42
【问题描述】:

我正在尝试在 python 中创建一个方法,将记录插入到一​​个表中,传递一个列名列表和一个关联的记录列表。

我能够将它设置在通过 for 循环动态填充列名的位置,但我无法弄清楚如何对值执行相同的操作,因为 psycopg2.executemany 函数依赖于将 %s 作为占位符。

是否可以通过循环动态填充字符串中 %s 的数量?有没有其他方法可以做到这一点?

def load_table(dbname,table_name,fields,records):
        try:
                #Variable Qty Column Loop
                sql_fields = []
                for i in fields:
                        i = sql.Identifier(i)
                        sql_fields.append(i)

                #Need similar loop to replace %s values
                #Replace (%s,%s,%s) ???
                #.....
                #.....
                sql_values = []
                for i in fields:
                        sql_values.append('%s')

                print(sql_values)
                flist = sql.SQL(',').join(sql_fields)  
                connection, cursor = create_connection(dbname)
                insert_query = sql.SQL('INSERT INTO {table_name} ({fields}) VALUES (%s,%s,%s)').format(
                table_name = sql.Identifier(table_name),
                fields = flist,
                cursor.executemany(insert_query,records)
                print('Records Loaded Successfully')

        except (Exception,psycopg2.Error) as error:
                print("Failed to insert record into table {error}".format(error = error))

        finally:
                # closing database connection.
                if (connection):
                        close_connection(connection,cursor)

【问题讨论】:

    标签: python sql dynamic formatting psycopg2


    【解决方案1】:

    您可以使用sql.Placeholder,用您需要的%s-placeholders 的数量填充sql 语句:

    def load_table(dbname,table_name,fields,records):
            con, cur = create_connection('foo')
            query = sql.SQL("insert into {} ({}) values ({})").format(
                sql.Identifier(table_name),
                sql.SQL(', ').join(map(sql.Identifier, fields)),
                sql.SQL(', ').join(sql.Placeholder() * len(fields)))
            print(query.as_string(con))
    
    
    if __name__ == '__main__':
        dbname = '...'
        table_name = 'messages'
        fields = ['user_id', 'message_type', 'message_title']
        records = [['12345', 'json', 'my first message'], ]
    
    load_table(dbname,table_name,fields,records)
    

    输出:

    insert into "messages" ("user_id", "message_type", "message_title") values (%s, %s, %s)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      相关资源
      最近更新 更多