Usando SQLAlchemy, um objeto Engine é criado assim:
from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")
O acesso engine
falhará se o banco de dados especificado no argumento para create_engine
(neste caso, mydb
) não existir. É possível dizer ao SQLAlchemy para criar um novo banco de dados se o banco de dados especificado não existir?
python
sqlalchemy
Anand Chitipothu
fonte
fonte
Respostas:
No postgres, três bancos de dados normalmente estão presentes por padrão. Se você puder se conectar como um superusuário (por exemplo, a
postgres
função), poderá se conectar aos bancos de dadospostgres
outemplate1
. O pg_hba.conf padrão permite que apenas o usuário Unix nomeadopostgres
use apostgres
função, então a coisa mais simples é simplesmente se tornar esse usuário. De qualquer forma, crie um mecanismo como de costume com um usuário que tenha as permissões para criar um banco de dados:engine.execute()
No entanto, você não pode usar , porque o postgres não permite que você crie bancos de dados dentro de transações e o sqlalchemy sempre tenta executar consultas em uma transação. Para contornar isso, obtenha a conexão subjacente do mecanismo:Mas a conexão ainda estará dentro de uma transação, então você deve encerrar a transação aberta com
commit
:E você pode então prosseguir para criar o banco de dados usando o comando PostgreSQL apropriado para ele.
fonte
conn.execute('drop database DBWithCaps')
, tive problemas com ele não reconhecendo as tampas.conn.execute('drop database "DBWithCaps"')
(com as aspas) funcionou bem.SQLAlchemy-Utils fornece tipos de dados personalizados e várias funções de utilitário para SQLAlchemy. Você pode instalar a versão oficial mais recente usando pip:
Os auxiliares de banco de dados incluem uma
create_database
função:fonte
psycopg2.OperationalError: fe_sendauth: no password supplied
. Ao usar"postgres://test:abc123@localhost:5432/test"
I getpsycopg2.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.
É possível evitar o gerenciamento manual de transações durante a criação do banco de dados fornecendo
isolation_level='AUTOCOMMIT'
paracreate_engine
funcionar:Além disso, se você não tiver certeza de que o banco de dados não existe, há uma maneira de ignorar o erro de criação do banco de dados devido à existência, suprimindo a
sqlalchemy.exc.ProgrammingError
exceção:fonte
Observe que não consegui obter as sugestões acima com
database_exists
porque sempre que verifico se o banco de dados existe usando senãodatabase_exists(engine.url):
, recebo este erro:Também
contextlib/suppress
não estava funcionando e não estou usando,postgres
então acabei fazendo isso para ignorar a exceção caso o banco de dados já exista com o SQL Server:fonte