使用pg8000的PostgreSQL将结果从一个SQL插入到另一个表



我正在尝试使用用于Python的pg8000驱动程序将PostgreSQL表中的行复制到另一个表中。这是代码:

import pg8000
conn = pg8000.connect(user="postgres", password="XXXXX",database="test")
cursor = conn.cursor()
cursor.execute("SELECT * FROM exampletable")
results = cursor.fetchall()

我现在想要的是将结果完全插入到一个新表中。应该是这样的:

cursor.executemany("INSERT INTO secondtable VALUES (%s)", results)

但不是以这种方式运行的,我不知道如何修复它。不是所有字段都是字符串类型的,也许应该以某种方式修复它?

格式%s适用于标量值。将结果转换为字符串,如下所示:

cursor.execute("INSERT INTO secondtable VALUES %s" % str(results))

有点偏离主题,但搜索相关问题会出现在这里。我想知道如何格式化execute sql字符串的绑定变量。koriander答案中给出的格式不适用于pg8000 1.10.5。以下是最终对我有效的:

    some_field_value = 'value'
    sql = 'SELECT a_field FROM your_table WHERE some_field = %s'
    cursor.execute(sql, [some_field_value])

文档中的详细信息:pg8000 Cursor.execute

重要的一点:

args–如果paramstyle是qmark、numeric或format,则此参数应该是要绑定到语句中的参数数组

需要记住两件事:

  1. pg8000从不接受格式字符串(%s)周围的引号
  2. pg8000.paramstyle的值很重要。默认值为"format"

实现这一点的方法是使用游标的executemany方法。

假设我们想将users表的内容复制到另一个名为users_copy*的表中。我们需要获取行,然后构造一个INSERT语句来执行。

import pg8000
conn = pg8000.connect(user='souser', password='password', database='test')
cursor = conn.cursor()
# Fetch the data.
cursor.execute('SELECT * FROM users')
results = cursor.fetchall()
# Construct the INSERT statement, dynamically creating the correct
# number of placeholders for the VALUES clause.
placeholders = ', '.join(['%s'] * len(results[0]))
stmt = f"""INSERT INTO users_copy VALUES ({placeholders})"""
# Insert to results into the target table.
cursor.executemany(stmt, results)
conn.commit()
conn.close()

*问题指定目标表在另一个数据库中,但我们不需要连接到另一个数据库来演示该技术。如果目标表在同一数据库中,则可以使用SELECT INTOCREATE TABLE ASINSERTINTO ... SELECT * FROM ...来避免检索数据,正如koriander所评论的那样。

相关内容

  • 没有找到相关文章

最新更新