Metoda Flask-SQLAlchemy's db.create_all()
tworzy każdą tabelę odpowiadającą moim zdefiniowanym modelom. Nigdy nie stwórz instancji modeli ani nie rejestruj ich. To tylko definicje klas, które dziedziczą po db.Model
. Skąd wiadomo, które modele zdefiniowałem?W jaki sposób Flask-SQLAlchemy create_all odkrywa modele do utworzenia?
Odpowiedz
Flask-SQLAlchemy nie robi nic specjalnego, to wszystko jest standardową częścią SQLAlchemy.
Wywołanie db.create_all
ostatecznie wywołuje db.Model.metadata.create_all
. Tabele są associated with a MetaData
instance as they are defined. Dokładny mechanizm jest bardzo skomplikowany w ramach SQLAlchemy, ponieważ prowadzi się wiele księgowań zza kulis, więc znacznie uprościłem wyjaśnienie.
db.Model
to declarative base class, który ma pewne specjalne zachowanie metaclass. Po zdefiniowaniu tworzy wewnętrznie instancję MetaData
, aby przechowywać wygenerowane tabele dla modeli. Podczas podklasy db.Model
zachowanie jej metaclass zapisuje klasę w db.Model._decl_class_registry
, a także w tabeli w db.Model.metadata
.
Klasy są definiowane tylko wtedy, gdy moduły je zawierające zostaną zaimportowane. Jeśli masz gdzieś napisany moduł my_models
, ale nigdy nie jest on importowany, jego kod nigdy nie jest wykonywany, więc modele nigdy nie są rejestrowane.
Może to być przyczyną pewnych nieporozumień dotyczących sposobu, w jaki SQLAlchemy wykrywa modele. Żadne moduły nie są "skanowane" dla podklas, db.Model.__subclasses__
nie jest używany, ale importowanie modułów gdzieś wymaga wymaganego do wykonania kodu.
- Moduł zawierający modele jest importowany i wykonywany.
- model definicja klasy jest wykonywany, podklasy tabeli
db.Model
- modelki jest zarejestrowany
db.Model.metadata
Dla jasności mówimy, że na przykład w scenariuszu, w którym żaden z modeli klas nie jest faktycznie tworzony w dowolnym miejscu skryptu, sposób działania SQLAlchemy polega na tym, że wszystkie klasy, które mają podklasę deklaratywnej klasy bazowej, są zapisywane w tej klasie rejestru (i dlatego są tworzone po wywołaniu metody create_all pomimo faktu, że te klasy modeli nie są wywoływane ani tworzone w dowolnym miejscu w skrypcie)? – SeanJarp
Musisz zadzwonić pod numer create_all()
w tym samym module, w którym znajdują się wszystkie modele. Jeśli tak nie jest, musisz je zaimportować. Następnie sqlalchemy przechodzi przez wszystkie klasy w tym module i sprawdza, czy dziedziczą one z db.model. Jeśli tak, może utworzyć tabelę korespondencyjną. Wyjaśniono również here.
Znalazłem metodę wbudowaną 'globals()' (https://docs.python.org/3.4/library/functions.html#globals), która zawiera listę wszystkich symboli w bieżącym module. Iterowanie poprzez klasy wyników i filtrowania, które dziedziczą db.Model wydaje się dość prostym rozwiązaniem. –
Właściwie to nie musi przechodzić przez wszystkie klasy w module. Jeśli wszystkie modele zostały zaimportowane, klasa db.Model .__ podklas __() poda wszystkie klasy dziedziczące z db.Model – TheGeorgeous
Jest to niepoprawne. SQLAlchemy nie "skanuje" zaimportowanych modułów dla podklas 'db.Model', ani nie używa podklas" db.Model .__ ". Przechowywanie rekordów odbywa się w czasie definiowania klasy, db.Model ma zachowanie metaclass, które rejestruje klasy i tabele. – davidism
- 1. Jaki jest rozsądny sposób utworzenia tego układu?
- 2. W jaki sposób obsługiwane są modele Backbone.JS z atrybutami obliczanymi
- 3. Jaki jest najprostszy sposób utworzenia żądania HTTP GET w Perlu?
- 4. Jaki jest najlepszy sposób utworzenia pola wyboru UIButton?
- 5. Jaki jest najlepszy sposób utworzenia miniatury strony internetowej?
- 6. Jaki jest najlepszy i najłatwiejszy sposób utworzenia formularza UITableView?
- 7. Pierwsze SQLAlchemy do wydawania TWORZENIE schematu w create_all
- 8. Jaki jest najlepszy kod JavaScript do utworzenia elementu img?
- 9. Najprostszy sposób utworzenia związku z dwóch list
- 10. usiłuje zrozumieć, w jaki sposób modele i asocjacje są zapisywane w szynach
- 11. Jak instruować SQLAlchemy do tworzenia tabel SQLTS FTS3 na create_all()?
- 12. W jaki sposób są przechowywane skompresowane modele w Kodzie EF 4.3 Pierwsze migracje __MigrationHistory table created?
- 13. Najlepszy sposób utworzenia obiektu potomnego od rodzica
- 14. Android NSD nie odkrywa wszystkich usług
- 15. Jaki język programowania jest wymagany do utworzenia wtyczki firefox?
- 16. W jaki sposób wysiewamy modele o relacjach HABTM z innymi modelami rozsianymi
- 17. W jaki sposób można podzielić modele Flask z aplikacji app.py bez przerzucania obiektu db?
- 18. Wielomianowe modele logitowe i zagnieżdżone modele logitowania
- 19. Modele w Backbone.js
- 20. W jaki sposób używasz MediaControllerCompat do sterowania bieżącym odtwarzaczem?
- 21. Czy istnieje sposób utworzenia niezmiennego (tylko do odczytu) dokumentu XD?
- 22. W jaki sposób mogę dokonać ponownego przypisania do pierwszego zatwierdzenia?
- 23. Modele raportów SSRS 2012
- 24. Jaki jest najlepszy sposób utworzenia tablicy podrzędnej z istniejącej tablicy w C++?
- 25. Job DSL do utworzenia zadania typu "Pipeline"
- 26. W WinForms, jaki jest najszybszy sposób utworzenia okna wyświetlającego dane wyjściowe konsoli?
- 27. Jaki jest najprostszy sposób utworzenia pustej iteracji przy użyciu wydajności w Pythonie?
- 28. Jaki jest poprawny sposób utworzenia niestandardowego narzędzia ustawiającego dla słabej właściwości w Objective C?
- 29. iOS 8 Core Bluetooth nie odkrywa urządzeń peryferyjnych
- 30. Skrypt uruchamiania do utworzenia schematu w HSQLDB
@davidism chciałem o tym wiedzieć, bo nie mogłem undestand jak to działało. Zwykle pracuję z językami niższego poziomu, które nie korzystają z możliwości refleksyjnych Pythona. W związku z tym byłem zaskoczony i przeglądanie kodu źródłowego nie ujawniło niczego oczywistego. Dziękuję za poświęcenie czasu na napisanie lepszego wyjaśnienia. –