Python psycopg2不能插入到postgresql表中

60 人关注

我正在使用下面的方法来尝试向一个postgresql数据库表插入一条记录,但它没有工作。我没有得到任何错误,但表中没有任何记录。我是否需要提交或什么?我使用的是与Bitnami djangostack安装一起安装的postgresql数据库。

import psycopg2
    conn = psycopg2.connect("dbname='djangostack' user='bitnami' host='localhost' password='password'")
except:
    print "Cannot connect to db"
cur = conn.cursor()
    cur.execute("""insert into cnet values ('r', 's', 'e', 'c', 'w', 's', 'i', 'd', 't')""")
except:
    print "Cannot insert"
    
3 个评论
警告。替换代码0】子句没有捕捉到特定的异常,对调试代码没有任何帮助。
在很多情况下,保持自动提交=False是最好的。因此,在执行完一个查询后,要手动提交:在cursor.execute()之后,做conn.commit()。
看看这篇文章中的答案吧。 Link
python
postgresql
insert
psycopg2
Superdooperhero
Superdooperhero
发布于 2013-08-06
4 个回答
aright
aright
发布于 2019-12-19
已采纳
0 人赞同

如果不想让每个条目都提交到数据库,你可以添加以下一行。

conn.autocommit = True

So your resulting code would be:

import psycopg2
    conn = psycopg2.connect("dbname='djangostack' user='bitnami' host='localhost' password='password'")
    conn.autocommit = True
except:
    print "Cannot connect to db"
cur = conn.cursor()
    cur.execute("""insert into cnet values ('r', 's', 'e', 'c', 'w', 's', 'i', 'd', 't')""")
except:
    print "Cannot insert"
    
你好,你知道如果你没有把自动提交设置为 "True",而你又从未提交,会发生什么? 看起来表的序列在增加,但是行在哪里?
@DanielBaughman:这是因为即使你不提交,序列也会递增;见例如[序列不受事务影响? ]( stackoverflow.com/questions/2095917/... )
Superdooperhero
Superdooperhero
发布于 2019-12-19
0 人赞同

事实证明,我在最后需要 conn.commit()

Eugene Yarmash
Eugene Yarmash
发布于 2019-12-19
0 人赞同

psycopg2 is Python DB API -兼容的,所以自动提交功能默认是关闭的。你需要调用 conn.commit 来提交任何未决的事务到数据库。由于连接(和游标)是上下文管理器,你可以简单地使用 with 语句,在离开上下文时自动提交/回滚一个事务。

with conn, conn.cursor() as cur:  # start a transaction and create a cursor
    cur.execute(sql)

From the docs:

当一个连接退出with块时,如果该块没有引发任何异常,那么事务将被提交。 的情况下,该事务就会被提交。如果出现 异常,事务将被回滚。

当游标退出with块时,它被关闭,释放了最终与之相关的任何 最终与它相关的资源。事务的状态 不受影响。

谢谢 -- 这是最好/最简洁的答案,我想。
这很好。我从一个函数中获得我的连接,并且能够实现如下:with get_connection(self.database_name, self.user_name) as conn, conn.cursor() as csr: csr.execute(statement) 意味着我可以在with语句的第二个值中引用第一个值,尽管第一个值没有被预定义。
heaven2sai
heaven2sai
发布于 2019-12-19
0 人赞同