【问题标题】:Postgres raises a "ACTIVE SQL TRANSACTION" (Errcode: 25001)Postgres 引发“ACTIVE SQL TRANSACTION”(错误代码:25001)
【发布时间】:2010-08-05 10:04:13
【问题描述】:

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

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您让我进入正确的方向。解决方案在这里描述:lists.initd.org/pipermail/psycopg/2002-February/000758.html
    • 抱歉,如果您使用 psycopg1,这就是解决方案,对于 psycopg2 而不是 conn.autocommit(),您执行 conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT),它应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2011-09-12
    • 2015-05-24
    • 2015-04-09
    • 2012-12-07
    • 2017-11-08
    • 2020-12-01
    相关资源
    最近更新 更多