Psycopg2:cursor.execute 工作不正常
Psycopg2: cursor.execute is not working properly
所以,我有以下代码将旧数据库的数据插入到新数据库中:
...
cur_old.execute("""SELECT DISTINCT module FROM all_students_users_log_course266""")
module_rows = cur_old.fetchall()
for row in module_rows:
cur_new.execute("""INSERT INTO modules(label) SELECT %s WHERE NOT EXISTS (SELECT 1 FROM modules WHERE label=%s)""", (row[0], row[0]))
...
最后一行执行一个查询,将标签插入到新数据库中 table。我在 pgAdmin
上测试了这个查询,它如我所愿。
但是,当执行脚本时,modules
table 上没有插入任何内容。 (实际上序列已更新,但 none 数据存储在 table 上)。
从游标调用execute方法后还需要做其他事情吗?
(Ps。脚本运行到最后没有任何错误)
您忘记了 connection.commit()
。数据库中的任何更改都必须在连接上进行提交。例如,sqlite3 documentation 在第一个示例中明确说明:
# Save (commit) the changes.
conn.commit()
psycopg2
documentation 中的第一个示例也是如此:
# Make the changes to the database persistent
>>> conn.commit()
正如 Evert 所说,缺少 commit()。始终在代码中指定它的替代方法是使用自动提交功能。
http://initd.org/psycopg/docs/connection.html#connection.autocommit
例如像这样:
with psycopg2.connect("...") as dbconn:
dbconn.autocommit=True
所以,我有以下代码将旧数据库的数据插入到新数据库中:
...
cur_old.execute("""SELECT DISTINCT module FROM all_students_users_log_course266""")
module_rows = cur_old.fetchall()
for row in module_rows:
cur_new.execute("""INSERT INTO modules(label) SELECT %s WHERE NOT EXISTS (SELECT 1 FROM modules WHERE label=%s)""", (row[0], row[0]))
...
最后一行执行一个查询,将标签插入到新数据库中 table。我在 pgAdmin
上测试了这个查询,它如我所愿。
但是,当执行脚本时,modules
table 上没有插入任何内容。 (实际上序列已更新,但 none 数据存储在 table 上)。
从游标调用execute方法后还需要做其他事情吗?
(Ps。脚本运行到最后没有任何错误)
您忘记了 connection.commit()
。数据库中的任何更改都必须在连接上进行提交。例如,sqlite3 documentation 在第一个示例中明确说明:
# Save (commit) the changes.
conn.commit()
psycopg2
documentation 中的第一个示例也是如此:
# Make the changes to the database persistent
>>> conn.commit()
正如 Evert 所说,缺少 commit()。始终在代码中指定它的替代方法是使用自动提交功能。
http://initd.org/psycopg/docs/connection.html#connection.autocommit
例如像这样:
with psycopg2.connect("...") as dbconn:
dbconn.autocommit=True