3

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

4

1 回答 1

3

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

从同一连接创建的游标不是孤立的,即游标对数据库所做的任何更改都可以立即被其他游标看到。从不同连接创建的游标可以或不可以隔离,具体取决于连接的隔离级别。另请参阅 rollback() 和 commit() 方法。

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

于 2010-08-05T10:30:13.553 回答