似乎没有执行psycopg2中的Commit()

时间:2014-08-17 08:53:04

标签: python postgresql cmd psycopg2

所以我有这个Python文件( dosql.py ):

import sys
import psycopg2

class doSql(object):
    #attributes
    _cxn = ""
    _cur = ""
    errmsg ="" 
    #methods
    def __init__(self): #constructor
        self._cxn = psycopg2.connect("dbname='postgres' user='postgres' password='4scoreand7yearsago' host='127.0.0.1' port='5432'")
        self._cur = self._cxn.cursor()

    def __del__(self): #destructor
        self._cur.close()
        self._cxn.close()

    def execqry(self, sql, apply_):
        rows = []
        try:
            self._cur.execute(sql)
            rows = self._cur.fetchall()
        if apply_:
                self._cxn.commit()
            if self._cur.rowcount == 0:
                rows.append(['None'])
        except:
            #errmsg = sys.exc_type + ":" + sys.exc_value 
            errmsg =  str(sys.exc_info()[1])
            rows.append([errmsg])
        return rows    

在pgAdmin中通过查询工具,我已经有一个表格,其中包含数据库“ postgres ”中的预定义数据。

CREATE TABLE misc (
     id int primary key,
     col1 text,
     col2 text
);

INSERT INTO misc VALUES (1, 'yes', 'i', 'entered');

在cmd中,我尝试在Python解释器中执行(相对于文件目录):

>>> execfile('dosql.py')
>>> a = doSql()
>>> i = a.execqry("SELECT * FROM misc", False)
>>> print i
[(1, 'yes', 'i', 'entered')]
>>> f = a.execqry("INSERT INTO misc VALUES (2, 'please', 'just', 'enter')", True)[0][0]
>>> print f
no results to fetch
>>> g = a.execqry("SELECT * FROM misc", False)
>>> print g
[(1, 'yes', 'i', 'entered'), (2, 'please', 'just', 'enter')]

但是当我去检查pgAdmin并浏览表格时,它不会更新为2行,仍然只有1,([1,'是','我','输入' ']数据)。

这是否意味着 self._cxn.commit()不起作用?此外,当我尝试再次重做整个过程,然后通过 del a 初始化析构函数时,仍然无效,没有更新的表。

请帮忙吗?

1 个答案:

答案 0 :(得分:0)

False参数的代码传递apply_;结果没有commit来电。

a.execqry("INSERT INTO ......", False)
                                ^^^^^

尝试使用True参数的代码。