带有 pg8000 的 PostgreSQL - 从 SQL 插入结果到另一个表
Posted
技术标签:
【中文标题】带有 pg8000 的 PostgreSQL - 从 SQL 插入结果到另一个表【英文标题】:PostgreSQL wiht pg8000 - INSERT results from an SQL to another table 【发布时间】:2015-04-08 13:26:18 【问题描述】:我正在尝试使用 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)
但不能以这种方式运行,我不知道如何解决它。并非所有字段都是字符串类型,也许应该以某种方式修复?
【问题讨论】:
您可以使用 INSERT INTO secondtable SELECT * FROM exampletable 一次性完成此操作 我想将一个表从一个数据库复制到另一个数据库,所以我需要2个游标 【参考方案1】:格式 %s 用于标量值。将结果转换为字符串,如下所示:
cursor.execute("INSERT INTO secondtable VALUES %s" % str(results))
【讨论】:
它显示了一个错误:文件“C:\Python34\lib\site-packages\pg8000\core.py”,第 1566 行,在执行 ps = cache['ps'][key] KeyError: ((705,), 'INSERT INTO secondtable VALUES %s') 是的,抱歉,将逗号替换为 %(请参阅修订后的答案) 现在它给出:TypeError: executemany() missing 1 required positional argument: 'param_sets' 不是所有的字段都是字符串类型的,可能是这个问题? 不,只需使用 execute 而不是 executemany。 executemany的问题是需要提前指定列数。【参考方案2】:稍微偏离主题,但搜索相关问题会导致此处。我想知道如何格式化执行 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,则此参数应该是要绑定到语句中的参数数组
要记住两件事:
-
pg8000 从不接受格式字符串 (%s) 周围的引号
pg8000.paramstyle 的值很重要。默认值为“格式”
【讨论】:
以上是关于带有 pg8000 的 PostgreSQL - 从 SQL 插入结果到另一个表的主要内容,如果未能解决你的问题,请参考以下文章
使用 pg-promise 记录特定的 postgresql 查询