我使用psycopg2在python中访问我的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代表“ACTIVE SQL TRANSACTION”。
我很确定没有其他连接在同一时间运行,并且在调用createDB之前我使用的每个连接都已关闭。
答案 0 :(得分:3)
看起来你的cursor()实际上是一个事务: http://initd.org/psycopg/docs/cursor.html#cursor
由同样创建的游标 连接不是孤立的,即任何连接 a对数据库所做的更改 光标立即可见 其他游标。游标创建自 不同的联系可以或不可以 被隔离,取决于 连接的隔离级别。也可以看看 rollback()和commit()方法。
跳过光标,然后执行查询。删除commit(),当你没有打开一个事务时就无法提交。