我使用的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不能在事务块内运行 与代表 “ACTIVE SQL TRANSACTION” 的错误代码25001。

我敢肯定,有在同一时间,我打电话CREATEDB之前使用的每一个连接没有运行其它连接将被关闭。

有帮助吗?

解决方案

它看起来像你的光标()实际上是一种交易: http://initd.org/psycopg/docs/cursor.html#cursor

  

从相同创建光标   连接不分离,即,任何   通过改变一个做数据库   光标是立即可见   其他光标。从游标创建   不同的连接可以或不可以   被分离,这取决于   连接隔离级别。也可以看看   回滚()和commit()方法。

跳到光标,只是执行查询。下降的commit()为好,当你没有打开事务不能提交。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top