Python psycopg2没有插入postgresql表

Sup*_*ero 29 python postgresql psycopg2 insert

我正在使用以下内容尝试将记录插入到postgresql数据库表中,但它无法正常工作.我没有收到任何错误,但表中没有记录.我需要提交还是其他什么?我正在使用随Bitnami djangostack安装一起安装的postgresql数据库.

import psycopg2

try:
    conn = psycopg2.connect("dbname='djangostack' user='bitnami' host='localhost' password='password'")
except:
    print "Cannot connect to db"

cur = conn.cursor()

try:
    cur.execute("""insert into cnet values ('r', 's', 'e', 'c', 'w', 's', 'i', 'd', 't')""")
except:
    print "Cannot insert"
Run Code Online (Sandbox Code Playgroud)

ari*_*ght 57

如果不想将每个条目提交到数据库,可以添加以下行:

conn.autocommit = True
Run Code Online (Sandbox Code Playgroud)

所以你得到的代码将是:

import psycopg2

try:
    conn = psycopg2.connect("dbname='djangostack' user='bitnami' host='localhost' password='password'")
    conn.autocommit = True
except:
    print "Cannot connect to db"

cur = conn.cursor()

try:
    cur.execute("""insert into cnet values ('r', 's', 'e', 'c', 'w', 's', 'i', 'd', 't')""")
except:
    print "Cannot insert"
Run Code Online (Sandbox Code Playgroud)

  • @DanielBaughman:这是因为即使你不提交,序列也会增加;参见例如[序列不受事务影响?](/sf/ask/146714221/) (2认同)

Sup*_*ero 33

事实证明我conn.commit()最终需要


Eug*_*ash 11

psycopg2是符合Python DB API的,因此默认情况下自动提交功能处于关闭状态.您需要调用conn.commit以将任何挂起的事务提交到数据库.由于连接(和游标)是上下文管理器,您只需使用该with语句在离开上下文时自动提交/回滚事务:

with conn, conn.cursor() as cur:  # start a transaction and create a cursor
    cur.execute(sql)
Run Code Online (Sandbox Code Playgroud)

来自文档:

当连接退出with块时,如果块没有引发异常,则提交事务.如果发生异常,则回滚事务.

当光标退出with块时,它将关闭,释放最终与之关联的任何资源.交易状态不受影响.

  • 谢谢-我认为这是最好/最干净的答案。 (2认同)

小智 6

import psycopg2
conn = psycopg2.connect("dbname='djangostack' user='bitnami' 
host='localhost' password='password'")
con.set_session(autocommit=True)
Run Code Online (Sandbox Code Playgroud)

  • 请不要仅发布代码答案,这对于一段时间内理解上下文的帮助不大。换句话说 - 即使它是最好的,你也不会得到赞成票,因为它对社区来说很难理解。 (8认同)
  • 呃,只要发布代码就没什么问题。有时,这是一种非常好的回答问题的方式。但是,是的,我认为这并没有完全回答OP的要求 (2认同)