有人可以向我解释为什么定义的test()。commit()不能用作varcon.commit()吗?其他一切似乎都很好。 (使用ubuntu-trusty-32的vagrant virtualbox)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import psycopg2
varcon = psycopg2.connect('dbname=tournament')
def test():
try:
psycopg2.connect("dbname=tournament")
except:
print("Connection to Tournament Database Failed")
else:
return psycopg2.connect('dbname=tournament')
def writer():
#db = psycopg2.connect('dbname=tournament')
c =varcon.cursor()
c.execute('select * from players')
data = c.fetchall()
c.execute("insert into players (name) values ('Joe Smith')")
varcon.commit()
varcon.close
print(data)
def writer2():
#db = psycopg2.connect('dbname=tournament')
c =test().cursor()
c.execute('select * from players')
data = c.fetchall()
c.execute("insert into players (name) values ('Joe Smith')")
test().commit()
test().close
print(data)
writer2() #this seem not commited, but database registers the insert by observing the serial promotion
#writer() # this works as expected
答案 0 :(得分:0)
这可能是因为功能块(return
)中的def
语句不等于=
之类的赋值
psycopg2连接函数返回一个连接对象,并将其分配给conn
或varcon
conn = psycopg2.connect("dbname=test user=postgres password=secret")
http://initd.org/psycopg/docs/module.html
test()
函数也返回psycopg2连接对象但在 writer2 中它没有分配给变量(内存位置),这意味着没有引用
这也解释了为什么数据库连接已建立(在测试函数中初始化)但提交不起作用(已损坏的引用)
(http://www.icu-project.org/docs/papers/cpp_report/the_anatomy_of_the_assignment_operator.html)
也许试试
ami=test()
ami.commit()
建立参考
答案 1 :(得分:0)
每次拨打psycopg2.connect()
时,都会打开新与数据库的连接。
如此有效地您的代码在一个连接中执行SQL,提交另一个连接,然后关闭第三个连接。即使在您的test()
功能中,您也会打开两个不同的连接。
我使用以下模式访问PostgreSQL:
conn = psycopg2.connect(DSN)
with conn:
with conn.cursor() as curs:
...
curs.execute(SQL1)
with conn:
with conn.cursor() as curs:
...
curs.execute(SQL2)
conn.close()
with
语句可确保在SQL周围打开并正确提交事务。如果with
中的代码引发异常,它还会自动回滚事务。