Używam SQLite jako formatu pliku aplikacji (zobacz here dla tego, dlaczego chciałbyś to zrobić) dla mojej aplikacji opartej na PySide. Oznacza to, że gdy użytkownik korzysta z mojej aplikacji, ich dane są zapisywane w jednym pliku bazy danych na ich komputerze. Używam SQLAlchemy ORM do komunikowania się z bazami danych.Używanie Alembic API z wewnętrznego kodu aplikacji
Po wydaniu nowych wersji aplikacji mogę zmodyfikować schemat bazy danych. Nie chcę, aby użytkownicy musieli wyrzucać swoje dane za każdym razem, gdy zmieniam schemat, więc muszę przeprowadzić migrację ich baz danych do najnowszego formatu. Ponadto tworzę tymczasowe bazy danych bardzo dużo, aby zapisać podzbiory danych do wykorzystania w niektórych procesach zewnętrznych. Chcę utworzyć te bazy danych za pomocą programu alembic, aby zostały oznaczone odpowiednią wersją.
mam kilka pytań:
Czy istnieje sposób, aby wywołać alembic od wewnątrz mojego kodu Pythona? Myślę, że to dziwne, że trzeba użyć
Popen
do czystego modułu Pythona, ale dokumenty używają alembiku z wiersza poleceń. Głównie, muszę zmienić lokalizację bazy danych, gdziekolwiek znajduje się baza danych użytkownika.Jeśli nie jest to możliwe, czy mogę określić nową lokalizację bazy danych z wiersza poleceń bez edytowania pliku .ini? To sprawiłoby, że dzwonienie na alembik przez
Popen
nic wielkiego.widzę, że alembic zachowuje informacje o wersji pod prostej tabeli o nazwie
alembic_version
, z jednej kolumnie o nazwieversion_num
i jednym rzędzie określa wersję. Czy mogę dodać tabelęalembic_version
do mojego schematu i wypełnić ją najnowszą wersją, gdy tworzę nowe bazy danych, więc nie ma narzutów? Czy to nawet dobry pomysł; czy powinienem używać alembiku do tworzenia wszystkich baz danych?
Mam alembik świetnie współpracujący z pojedynczą bazą danych, z której korzystam w swoim katalogu projektu. Chcę używać programu alembic do wygodnej migracji i tworzenia baz danych w dowolnych lokalizacjach, najlepiej za pośrednictwem jakiegoś interfejsu API języka Python, a nie wiersza poleceń. Ta aplikacja jest również zamrożona przez cx_Freeze, w przypadku, która robi różnicę.
Dzięki!