Menggunakan SQLAlchemy, objek Engine dibuat seperti ini:
from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")
Mengakses engine
gagal jika database yang ditentukan dalam argumen ke create_engine
(dalam kasus ini, mydb
) tidak ada. Apakah mungkin untuk memberi tahu SQLAlchemy untuk membuat database baru jika database yang ditentukan tidak ada?
python
sqlalchemy
Anand Chitipothu
sumber
sumber
Jawaban:
Pada postgres, tiga database biasanya hadir secara default. Jika Anda dapat terhubung sebagai pengguna super (misalnya,
postgres
peran), maka Anda dapat terhubung ke databasepostgres
atautemplate1
. Default pg_hba.conf hanya mengizinkan pengguna unix yang diberi namapostgres
untuk menggunakanpostgres
peran tersebut, jadi hal yang paling sederhana adalah menjadi pengguna tersebut. Bagaimanapun, buat mesin seperti biasa dengan pengguna yang memiliki izin untuk membuat database:engine.execute()
Namun, Anda tidak dapat menggunakan , karena postgres tidak mengizinkan Anda membuat database di dalam transaksi, dan sqlalchemy selalu mencoba menjalankan kueri dalam transaksi. Untuk menyiasati ini, dapatkan koneksi yang mendasari dari mesin:Tetapi koneksi tersebut masih ada di dalam transaksi, jadi Anda harus mengakhiri transaksi terbuka dengan
commit
:Dan Anda kemudian dapat melanjutkan untuk membuat database menggunakan perintah PostgreSQL yang tepat untuknya.
sumber
conn.execute('drop database DBWithCaps')
saya memiliki masalah dengan itu tidak mengenali topi.conn.execute('drop database "DBWithCaps"')
(dengan tanda kutip) bekerja dengan baik.SQLAlchemy-Utils menyediakan tipe data kustom dan berbagai fungsi utilitas untuk SQLAlchemy. Anda dapat menginstal versi resmi terbaru menggunakan pip:
The pembantu Database termasuk
create_database
fungsi:sumber
psycopg2.OperationalError: fe_sendauth: no password supplied
. Saat menggunakan"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.
Ini mungkin untuk menghindari manajemen transaksi pengguna sekaligus menciptakan database dengan memberikan
isolation_level='AUTOCOMMIT'
kecreate_engine
fungsi:Juga jika Anda tidak yakin bahwa database tidak ada, ada cara untuk mengabaikan kesalahan pembuatan database karena keberadaannya dengan menekan
sqlalchemy.exc.ProgrammingError
pengecualian:sumber
Harap dicatat bahwa saya tidak bisa mendapatkan saran di atas
database_exists
karena setiap kali saya memeriksa apakah database ada menggunakan jika tidakdatabase_exists(engine.url):
saya mendapatkan kesalahan ini:Juga
contextlib/suppress
tidak berfungsi dan saya tidak menggunakanpostgres
jadi saya akhirnya melakukan ini untuk mengabaikan pengecualian jika database sudah ada dengan SQL Server:sumber