3

Pythonでpostgresデータベースにアクセスするためにpsycopg2を使用しています。私の関数は新しいデータベースを作成する必要があります。コードは次のようになります。

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 サーバーがエラーをスローします。「ACTIVE SQL TRANSACTION」を表すエラーコード 25001 のトランザクション ブロック内で CREATE DATABASE を実行できません。

同時に実行されている他の接続がなく、createDB を呼び出す前に使用したすべての接続がシャットダウンされていることは確かです。

4

1 に答える 1

3

あなたのcursor()は実際にはトランザクションのようです: http://initd.org/psycopg/docs/cursor.html#cursor

同じ接続から作成されたカーソルは分離されません。つまり、カーソルによってデータベースに加えられた変更は、他のカーソルによってすぐに表示されます。異なる接続から作成されたカーソルは、接続の分離レベルに応じて、分離できる場合とできない場合があります。rollback() および commit() メソッドも参照してください。

カーソルをスキップして、クエリを実行するだけです。commit() も削除します。トランザクションを開いていないとコミットできません。

于 2010-08-05T10:30:13.553 に答える