Usando SQLAlchemy, un objeto Engine se crea así:
from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")
El acceso engine
falla si la base de datos especificada en el argumento a create_engine
(en este caso, mydb
) no existe. ¿Es posible decirle a SQLAlchemy que cree una nueva base de datos si la base de datos especificada no existe?
python
sqlalchemy
Anand Chitipothu
fuente
fuente
Respuestas:
En postgres, normalmente hay tres bases de datos presentes de forma predeterminada. Si puede conectarse como superusuario (por ejemplo, el
postgres
rol), puede conectarse a las bases de datospostgres
otemplate1
. El pg_hba.conf predeterminado permite que solo el usuario de Unix nombradopostgres
use elpostgres
rol, por lo que lo más simple es convertirse en ese usuario. En cualquier caso, cree un motor como de costumbre con un usuario que tenga los permisos para crear una base de datos:engine.execute()
Sin embargo, no puede usarlo , porque postgres no le permite crear bases de datos dentro de las transacciones y sqlalchemy siempre intenta ejecutar consultas en una transacción. Para evitar esto, obtenga la conexión subyacente del motor:Pero la conexión seguirá estando dentro de una transacción, por lo que debe finalizar la transacción abierta con
commit
:Y luego puede proceder a crear la base de datos utilizando el comando PostgreSQL adecuado para ello.
fuente
conn.execute('drop database DBWithCaps')
tuve problemas porque no reconocía las tapas.conn.execute('drop database "DBWithCaps"')
(con las comillas) funcionó bien.SQLAlchemy-Utils proporciona tipos de datos personalizados y varias funciones de utilidad para SQLAlchemy. Puede instalar la versión oficial más reciente usando pip:
Los ayudantes de la base de datos incluyen una
create_database
función:fuente
psycopg2.OperationalError: fe_sendauth: no password supplied
. Cuando lo uso"postgres://test:abc123@localhost:5432/test"
, obtengopsycopg2.OperationalError: FATAL: password authentication failed for user "test"
"postgres://test:abc123@localhost:9000/test"
psycopg2.OperationalError: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
Es posible evitar la gestión manual de transacciones mientras se crea una base de datos proporcionando
isolation_level='AUTOCOMMIT'
a lacreate_engine
función:Además, si no está seguro de que la base de datos no existe, hay una forma de ignorar el error de creación de la base de datos debido a la existencia suprimiendo la
sqlalchemy.exc.ProgrammingError
excepción:fuente
Tenga en cuenta que no pude obtener las sugerencias anteriores
database_exists
porque cada vez que verifico si la base de datos existe usando si nodatabase_exists(engine.url):
, aparece este error:Además
contextlib/suppress
, no estaba funcionando y no estoy usando,postgres
así que terminé haciendo esto para ignorar la excepción si la base de datos ya existe con SQL Server:fuente