Postgres вызывает «ACTIVE SQL TRANSACTION» (код ошибки: 25001) - PullRequest
3 голосов
/ 05 августа 2010

Я использую psycopg2 для доступа к моей базе данных postgres в python. Моя функция должна создать новую базу данных, код выглядит так:

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, который обозначает «АКТИВНАЯ СДЕЛКА SQL».

Я почти уверен, что в это же время не выполняется ни одно другое соединение, и все соединения, которые я использовал перед вызовом createDB, закрываются.

1 Ответ

3 голосов
/ 05 августа 2010

Похоже, ваш курсор () на самом деле является транзакцией: http://initd.org/psycopg/docs/cursor.html#cursor

Курсоры, созданные из того же соединения не изолированы, т. е. любые изменения, внесенные в базу данных курсор сразу виден другие курсоры. Курсоры, созданные из разные соединения могут или не могут быть изолированным, в зависимости от уровень изоляции соединений. Смотрите также Методы rollback () и commit ().

Пропустите курсор и просто выполните свой запрос. Также вы можете удалить commit (), вы не можете выполнить коммит, если у вас нет открытой транзакции.

...