Postgres引发了“活动SQL事务”(错误代码:25001)

时间:2010-08-05 10:04:13

标签: python postgresql psycopg2

我使用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之前我使用的每个连接都已关闭。

1 个答案:

答案 0 :(得分:3)

看起来你的cursor()实际上是一个事务: http://initd.org/psycopg/docs/cursor.html#cursor

  

由同样创建的游标   连接不是孤立的,即任何连接   a对数据库所做的更改   光标立即可见   其他游标。游标创建自   不同的联系可以或不可以   被隔离,取决于   连接的隔离级别。也可以看看   rollback()和commit()方法。

跳过光标,然后执行查询。删除commit(),当你没有打开一个事务时就无法提交。