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.