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