Postgres 报错 "ACTIVE SQL TRANSACTION" (错误码:25001)

3 投票
1 回答
3124 浏览
提问于 2025-04-16 02:22

我在用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()也可以不需要,因为当你没有打开事务时,是无法提交的。

撰写回答