Jestem nowy zarówno w flask, jak i sqlalchemy, dopiero zaczynam pracę nad aplikacją do kolb i na razie używam sqlalchemy. Zastanawiałem się, czy jest jakaś znacząca korzyść, jaką mogę uzyskać z używania flask-sqlalchemy vs sqlalchemy. Nie mogłem znaleźć wystarczającej liczby motywacji w http://packages.python.org/Flask-SQLAlchemy/index.html lub może nie zrozumiałem wartości !! Byłbym wdzięczny za wyjaśnienia.
python
flask
sqlalchemy
flask-sqlalchemy
Jestem w
źródło
źródło
flask-sqlalchemy
są przestarzałesqlalchemy
w aplikacji Flask?Flask-SqlAlchemy
że nie zapewnia żadnego sposobu na skonfigurowanie wielu dzierżawców w aplikacji. To jest największy minus IMO.binds
pod warunkiem, że jest dołączenie innej bazy danych do innego modelu, podczas gdy nie ma możliwości korzystania z bazy danych specyficznej dla dzierżawcy z tym samym modelem.Odpowiedzi:
Główną cechą programu
Flask-SQLAlchemy
jest odpowiednia integracja z aplikacją Flask - tworzy i konfiguruje silnik, połączenie i sesję oraz konfiguruje go do współpracy z aplikacją Flask.Ta konfiguracja jest dość złożona, ponieważ musimy utworzyć sesję o określonym zakresie i odpowiednio ją obsłużyć zgodnie z cyklem życia żądania / odpowiedzi aplikacji Flask.
W idealnym świecie byłaby to jedyna cecha
Flask-SQLAlchemy
, ale w rzeczywistości dodaje kilka rzeczy więcej. Oto dobry wpis na blogu z ich omówieniem: Demistyfikacja Flask-SQLAlchemy .Kiedy po raz pierwszy pracowałem z Flaskiem i SQLAlchemy, nie podobał mi się ten narzut. Podszedłem i wyodrębniłem kod zarządzania sesją z rozszerzenia. To podejście działa, chociaż odkryłem, że wykonanie tej integracji jest dość trudne.
Tak więc łatwiejszym podejściem (które jest używane w innym projekcie, nad którym pracuję) jest po prostu wpuszczenie
Flask-SQLAlchemy
i nie korzystanie z żadnych dodatkowych funkcji, które zapewnia. Będziesz miećdb.session
i możesz go używać tak, jakby to była czystaSQLAlchemy
konfiguracja.źródło
This setup is quite complex as we need to create the scoped session and properly handle it according to the Flask application request/response life-cycle.
Zobacz więcej szczegółów w dokumentacji SQLAlchemy: Kiedy konstruować sesję, kiedy ją zatwierdzam i kiedy Zamknij to? i sesje kontekstowe / lokalne wątku .Flask-SQLAlchemy daje ci wiele fajnych dodatków, które w innym przypadku zaimplementowałbyś sam za pomocą SQLAlchemy.
Pozytywne strony korzystania z Flask-SQLAlchemy
apply_driver_hacks
która automatycznie ustawia rozsądne wartości domyślne na thigs, takie jak rozmiar puli MySQLAutomatycznie ustaw nazwy tabel. Flask-SQLAlchemy automatycznie ustawia nazwy tabel, konwertując
ClassName
>class_name
można to nadpisać ustawiając__tablename__
element listy klasyNegatywne strony korzystania z Flask-SQLAlchemy
źródło
Szczerze mówiąc, nie widzę żadnych korzyści. IMHO, Flask-SQLAlchemy tworzy dodatkową warstwę, której tak naprawdę nie potrzebujesz. W naszym przypadku mamy dość złożoną aplikację Flask z wieloma bazami danych / połączeniami (master-slave) wykorzystującą zarówno ORM, jak i Core, gdzie między innymi musimy kontrolować nasze sesje / transakcje DB (np. Tryby dryrun vs commit). Flask-SQLAlchemy dodaje dodatkowe funkcje, takie jak automatyczne niszczenie sesji, zakładając pewne rzeczy, które często nie są tym, czego potrzebujesz.
źródło
Dokumentacja SQLAlchemy jasno stwierdza, że powinieneś używać Flask-SQLAlchemy (zwłaszcza jeśli nie rozumiesz jego zalet!):
Ten cytat i szczegółową motywację można znaleźć w drugim pytaniu sesji FAQ .
źródło
jak sugeruje @schlamar, Flask-SqlAlchemy jest zdecydowanie dobrą rzeczą. Chciałbym tylko dodać trochę dodatkowego kontekstu do tego, co zostało tam przedstawione.
Nie myśl, że wybierasz jedno nad drugim. Na przykład powiedzmy, że chcemy pobrać wszystkie rekordy z tabeli przy użyciu modelu używającego Flask-Sqlalchemy. To tak proste, jak
W wielu prostych przypadkach Flask-Sqlalchemy będzie całkowicie w porządku. Dodatkową kwestią, którą chciałbym poruszyć, jest to, że jeśli Flask-Sqlalchemy nie zrobi tego, co chcesz, to nie ma powodu, dla którego nie możesz używać SqlAlchemy bezpośrednio.
from myapp.database import db num_foo = db.session.query(func.count(OtherModel.id)).filter(is_deleted=False).as_scalar() db.session.query(Model.id, num_foo.label('num_foo')).order_by('num_foo').all()
Jak widać, możemy łatwo przeskakiwać z jednego do drugiego bez problemu, aw drugim przykładzie faktycznie używamy modeli zdefiniowanych przez Flask-Sqlalchemy.
źródło
Model.query.all()
„ - to wszystko można zrobić tylko za pomocą SQLAlchemy, użycie Flask-SQLAlchemy nie zapewnia tutaj absolutnie nic nowego.Model.query.all()
nadb.session.query(Model).all()
z jakiegoś powodu, co umożliwiło normalne śledzenie i aktualizowanie sesji.Oto przykład korzyści, jakie daje flask-sqlalchemy w porównaniu do zwykłej sqlalchemy.
Załóżmy, że używasz flask_user.
flask_user automatyzuje tworzenie i uwierzytelnianie obiektów użytkowników, więc musi mieć dostęp do Twojej bazy danych. Klasa UserManager robi to, wywołując coś, co nazywa się „adapterem”, który wyodrębnia wywołania bazy danych. Dostarczasz adapter w konstruktorze UserManager, a adapter musi implementować następujące funkcje:
class MyAdapter(DBAdapter): def get_object(self, ObjectClass, id): """ Retrieve one object specified by the primary key 'pk' """ pass def find_all_objects(self, ObjectClass, **kwargs): """ Retrieve all objects matching the case sensitive filters in 'kwargs'. """ pass def find_first_object(self, ObjectClass, **kwargs): """ Retrieve the first object matching the case sensitive filters in 'kwargs'. """ pass def ifind_first_object(self, ObjectClass, **kwargs): """ Retrieve the first object matching the case insensitive filters in 'kwargs'. """ pass def add_object(self, ObjectClass, **kwargs): """ Add an object of class 'ObjectClass' with fields and values specified in '**kwargs'. """ pass def update_object(self, object, **kwargs): """ Update object 'object' with the fields and values specified in '**kwargs'. """ pass def delete_object(self, object): """ Delete object 'object'. """ pass def commit(self): pass
Jeśli używasz flask-sqlalchemy, możesz użyć wbudowanego SQLAlchemyAdapter. Jeśli używasz sqlalchemy (nie-flask-sqlalchemy), możesz przyjąć różne założenia dotyczące sposobu, w jaki obiekty są zapisywane w bazie danych (np. Nazwy tabel), więc będziesz musiał napisać własną klasę adaptera.
źródło