我正在尝试使用用于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,则此参数应该是要绑定到语句中的参数数组
需要记住两件事:
- pg8000从不接受格式字符串(%s)周围的引号
- 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 INTO
、CREATE TABLE AS
或INSERTINTO ... SELECT * FROM ...
来避免检索数据,正如koriander所评论的那样。