Python3 psycopg2承诺问题使用变量vs函数进行连接

时间:2017-01-06 08:43:10

标签: python python-3.x psycopg2

有人可以向我解释为什么定义的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

2 个答案:

答案 0 :(得分:0)

这可能是因为功能块(return)中的def语句不等于=之类的赋值 psycopg2连接函数返回一个连接对象,并将其分配给connvarcon

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中的代码引发异常,它还会自动回滚事务。

参考:http://initd.org/psycopg/docs/usage.html#with-statement