Postgres 引发“ACTIVE SQL TRANSACTION” (错误代码:25001)

发布于 2024-09-13 08:16:38 字数 756 浏览 3 评论 0原文

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

I use psycopg2 for accessing my postgres database in python. My function should create a new database, the code looks like this:

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)

When I call createDB my postgres server throws an error:
CREATE DATABASE cannot run inside a transaction block
with the errorcode 25001 which stands for "ACTIVE SQL TRANSACTION".

I'm pretty sure that there is no other connection running at the same time and every connection I used before calling createDB is shut down.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苍风燃霜 2024-09-20 08:16:38

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

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

跳过光标并只执行您的查询。也删除 commit() ,当你没有打开事务时你无法提交。

It looks like your cursor() is actually a transaction:
http://initd.org/psycopg/docs/cursor.html#cursor

Cursors created from the same
connection are not isolated, i.e., any
changes done to the database by a
cursor are immediately visible by the
other cursors. Cursors created from
different connections can or can not
be isolated, depending on the
connections’ isolation level. See also
rollback() and commit() methods.

Skip the cursor and just execute your query. Drop commit() as well, you can't commit when you don't have a transaction open.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文