Postgres 报错 "ACTIVE SQL TRANSACTION" (错误码:25001)
我在用Python的psycopg2库来访问我的Postgres数据库。我的函数应该用来创建一个新的数据库,代码大概是这样的:
def createDB(host, username, dbname):
adminuser = settings.DB_ADMIN_USER
adminpass = settings.DB_ADMIN_PASS
try:
conn=psycopg2.connect(user=adminuser, password=adminpass, host=host)
cur = conn.cursor()
cur.execute("CREATE DATABASE %s OWNER %s" % (nospecial(dbname), nospecial(username)))
conn.commit()
except Exception, e:
raise e
finally:
cur.close()
conn.close()
def nospecial(s):
pattern = re.compile('[^a-zA-Z0-9_]+')
return pattern.sub('', s)
但是当我调用createDB的时候,我的Postgres服务器报了一个错: CREATE DATABASE不能在事务块内运行 错误代码是25001,意思是“活动的SQL事务”。
我很确定在这个时候没有其他连接在运行,而且在调用createDB之前,我用过的所有连接都已经关闭了。
1 个回答
3
看起来你的cursor()其实是一个事务:
http://initd.org/psycopg/docs/cursor.html#cursor
从同一个连接创建的游标是互相影响的,也就是说,一个游标对数据库所做的任何修改,其他游标都能立刻看到。如果是从不同的连接创建的游标,它们之间的影响就要看连接的隔离级别了。你也可以看看rollback()和commit()这两个方法。
可以跳过游标,直接执行你的查询。commit()也可以不需要,因为当你没有打开事务时,是无法提交的。