postgres pg8000 создать базу данных

Я пытаюсь создать базу данных с драйвером pg8000 postgressql, но не могу создать. Создание БД вручную, а затем подключение к нему прекрасно работает со мной, но мне нужно создать БД с моим кодом. Я получаю сообщение об ошибке "sqlalchemy.exc.ProgrammingError: (pg8000.ProgrammingError)". Я попробовал ниже код для создания БД.

from sqlalchemy import create_engine
dburl = "postgresql+pg8000://user:pswd@myip:5432/postgres/"
engine = create_engine(dburl)
conn = engine.connect()
conn.execute("COMMIT")
conn.execute("CREATE DATABASE qux")

Я также попробовал с ниже -

from sqlalchemy import create_engine
from sqlalchemy.engine import url
settings ={"drivername" : "postgresql+pg8000", "host" : "myip","port" : 5432,"username" : "user","password" : "pswd","database" : "MyTestDB"}
db=create_engine(url.URL(**settings))
db.execute("commit")

Это именно та ошибка, которую я получаю """sqlalchemy.exc.ProgrammingError: (pg8000.ProgrammingError) ('ОШИБКА', '25001', 'CREATE DATABASE не может выполняться внутри блока транзакции') [SQL: 'create database workDB']""""

Пожалуйста, предложите, как я могу создать эту БД...

2 ответа

Вот решение:

from sqlalchemy import create_engine
dburl = "postgresql+pg8000://user:pswd@myip:5432/postgres/"
engine = create_engine(dburl)
conn = engine.connect()

con.rollback()  # Make sure we're not in a transaction
con.autocommit = True  # Turn on autocommit

conn.execute("CREATE DATABASE qux")
 
con.autocommit = False  # Turn autocommit back off again

В документации говорится об этой проблеме выполнения команд, которые нельзя запустить в транзакции. Дело в том, что pg8000 автоматически выполняет начальную транзакцию перед любым execute(), если транзакция еще не выполняется. Это нормально, пока вы не приступите к выполнению команды, которая не может быть выполнена внутри транзакции. В этом случае вам нужно войти в режим автоматической фиксации, который неявно запускает транзакцию перед оператором и фиксирует ее впоследствии, но автоматически избегает этого, если (например, CREATE DATABASE) оператор не может быть выполнен в транзакции.

Лучшее решение — включить autocommit при создании движка.

      engine = create_engine(dburl, isolation_level="AUTOCOMMIT")

чтобы избежать запутанного и потенциально опасного отката() перед включением автофиксации.

SQLAlchemy выполняет множество скрытых проверок транзакций, прежде чем передать соединение пользователю. Откат может привести к поломке некоторых из них, особенно плохо протестированных баз данных, которые предпочитают использовать проводные протоколы postgres.

Пожалуйста, смотрите мой подробный ответ на странице Postgres pg8000 Create Database.

Другие вопросы по тегам