Za pomocą SQLAlchemy tworzony jest obiekt Engine w następujący sposób:
from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")
Dostęp engine
nie powiedzie się, jeśli baza danych określona w argumencie do create_engine
(w tym przypadku mydb
) nie istnieje. Czy można powiedzieć SQLAlchemy, aby utworzył nową bazę danych, jeśli określona baza danych nie istnieje?
python
sqlalchemy
Anand Chitipothu
źródło
źródło
Odpowiedzi:
W Postgres domyślnie są obecne trzy bazy danych. Jeśli możesz połączyć się jako superużytkownik (np.
postgres
Rola), możesz połączyć się z bazami danychpostgres
lubtemplate1
. Domyślny pg_hba.conf zezwala tylko unixowemu użytkownikowi nazwanemupostgres
na używaniepostgres
roli, więc najprościej jest po prostu zostać tym użytkownikiem. W każdym razie utwórz silnik w zwykły sposób z użytkownikiem, który ma uprawnienia do tworzenia bazy danych:Nie możesz jednak użyć
engine.execute()
, ponieważ postgres nie pozwala na tworzenie baz danych wewnątrz transakcji, a sqlalchemy zawsze próbuje uruchamiać zapytania w transakcji. Aby obejść ten problem, uzyskaj podstawowe połączenie z silnika:Ale połączenie nadal będzie wewnątrz transakcji, więc musisz zakończyć otwartą transakcję za pomocą
commit
:Następnie możesz przystąpić do tworzenia bazy danych za pomocą odpowiedniego polecenia PostgreSQL.
źródło
conn.execute('drop database DBWithCaps')
, miałem z tym problem z nierozpoznawaniem kapsli.conn.execute('drop database "DBWithCaps"')
(z cudzysłowami) działało dobrze.SQLAlchemy-Utils zapewnia niestandardowe typy danych i różne funkcje narzędziowe dla SQLAlchemy. Możesz zainstalować najnowszą oficjalną wersję za pomocą pip:
W pomocnicy baza zawiera
create_database
funkcję:źródło
psycopg2.OperationalError: fe_sendauth: no password supplied
. Kiedy używam"postgres://test:abc123@localhost:5432/test"
, dostajępsycopg2.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.
Podczas tworzenia bazy danych można uniknąć ręcznego zarządzania transakcjami, udostępniając
isolation_level='AUTOCOMMIT'
docreate_engine
funkcji:Ponadto, jeśli nie jesteś pewien, że baza danych nie istnieje, istnieje sposób na zignorowanie błędu tworzenia bazy danych z powodu istnienia poprzez
sqlalchemy.exc.ProgrammingError
pominięcie wyjątku:źródło
Zwróć uwagę, że nie mogłem uzyskać powyższych sugestii,
database_exists
ponieważ za każdym razem, gdy sprawdzam, czy baza danych istnieje, używając polecenia Jeśli niedatabase_exists(engine.url):
, otrzymuję ten błąd:Również
contextlib/suppress
nie działał i nie używam,postgres
więc w końcu zrobiłem to, aby zignorować wyjątek, jeśli baza danych już istnieje w SQL Server:źródło