flask-sqlalchemy lub sqlalchemy

95

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.

Jestem w
źródło
6
Hmm, nadal nie ma tutaj satysfakcjonującej odpowiedzi. Czy ktoś może wyjaśnić, jakie rzeczywiste konkretne korzyści flask-sqlalchemysą przestarzałe sqlalchemyw aplikacji Flask?
Steve Bennett
Jednak jedną wielką wadą jest to, Flask-SqlAlchemyże nie zapewnia żadnego sposobu na skonfigurowanie wielu dzierżawców w aplikacji. To jest największy minus IMO. bindspod 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.
Rohit Jain

Odpowiedzi:

70

Główną cechą programu Flask-SQLAlchemyjest 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-SQLAlchemyi nie korzystanie z żadnych dodatkowych funkcji, które zapewnia. Będziesz mieć db.sessioni możesz go używać tak, jakby to była czysta SQLAlchemykonfiguracja.

Boris Serebrov
źródło
4
Jestem zdezorientowany. Podlinkowany post na blogu (i oficjalna dokumentacja!) Zawiera listę niektórych zwykłych funkcji SQLAlchemy (takich jak deklaratywna podstawa), tak jakby były one funkcjami Flask-SQLAlchemy; nie jest jasne, czy biorą pod uwagę rzeczy wbudowane w SQLAlchemy, czy też je ponownie zaimplementowali (ani dlaczego to zrobili, jeśli jest to drugie). Twój pierwszy akapit wymienia dwie funkcje: wygodne opakowania do zarządzania sesjami (ale czy nie będziesz musiał tworzyć własnych, jeśli chcesz używać swoich modeli SQLAlchemy poza Flaskiem?) I nieokreśloną „konfigurację” do „pracy z aplikacją Flask” . Co to oznacza ?
Mark Amery,
1
Jestem też trochę zdezorientowany pytaniami. Powiązany wpis na blogu jest dość przejrzysty IMO, na przykład mówi: „Niestandardowy deklaratywny model podstawowy z obsługą właściwości zapytania i paginacji” klucz jest „niestandardowy”, a „z obsługą właściwości zapytania i paginacji” jest tym, co dodaje do Deklaratywna podstawa SQLAlchemy.
Boris Serebrov
1
Odnośnie „wygodnych opakowań” - nie są one dla wygody, ale dla poprawnego działania. Aby rozpocząć korzystanie z SQLAlchemy, potrzebujesz obiektów połączenia z bazą danych (eninge / connection / session) i nie chcesz ich tworzyć za każdym razem, gdy musisz wykonać zapytanie SQL, więc powinny one być tworzone globalnie i dostępne w kodzie aplikacji. Możesz więc zrobić coś w rodzaju „z importu bazy danych aplikacji”, a następnie wykonać „db.session.something ()” bez zastanawiania się, jak poprawnie utworzyć i zainicjować ten obiekt „db”.
Boris Serebrov
A jeśli chodzi o nieokreśloną „konfigurację” do „pracy z aplikacją Flask” - jest to faktycznie określone w drugim akapicie: 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 .
Boris Serebrov
22

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


  1. Flask_SQLAlchemy obsługuje konfigurację, konfigurację i rozłączanie sesji za Ciebie.
  2. Zapewnia deklaratywny model podstawowy, który ułatwia wykonywanie zapytań i stronicowanie
  3. Ustawienia specyficzne dla zaplecza.Flask-SQLAlchemy skanuje zainstalowane biblioteki pod kątem obsługi Unicode, a jeśli zawiedzie, automatycznie używa SQLAlchemy Unicode.
  4. Posiada metodę o nazwie, apply_driver_hacksktóra automatycznie ustawia rozsądne wartości domyślne na thigs, takie jak rozmiar puli MySQL
  5. Posiada ładne wbudowane metody create_all () i drop_all () do tworzenia i usuwania wszystkich tabel. Przydatne do testowania iw linii poleceń Pythona, jeśli zrobiłeś coś głupiego
  6. Daje ci get_or_404 () zamiast get () i find_or_404 () zamiast find () Przykład kodu na> http://flask-sqlalchemy.pocoo.org/2.1/queries/

Automatycznie ustaw nazwy tabel. Flask-SQLAlchemy automatycznie ustawia nazwy tabel, konwertując ClassName> class_namemożna to nadpisać ustawiając __tablename__element listy klasy

Negatywne strony korzystania z Flask-SQLAlchemy


  1. Korzystanie z Flask-SQLAlchemy spowoduje dodatkowe utrudnienia w migracji z Flask do, powiedzmy, Pyramid, jeśli kiedykolwiek zajdzie taka potrzeba. Wynika to głównie z niestandardowego, deklaratywnego modelu podstawowego w Flask_SQLAchemy.
  2. Używając Flask-SQLAlchemy ryzykujesz, że użyjesz pakietu ze znacznie mniejszą społecznością niż sama SQLAlchemy, której nie mogę łatwo porzucić z aktywnego rozwoju w najbliższym czasie.
  3. Kilka fajnych dodatków Flask-SQLAlchemy może wprawić Cię w zakłopotanie, jeśli nie wiesz, że tam są.
Kimmo Hintikka
źródło
21

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.

MOCKBA
źródło
6
Tak, w twoim przypadku Flask-SQLAlchemy wydaje się przestarzały. Ale gdyby PO miał taki scenariusz, to pewnie nie zada tego pytania. Dla nowego użytkownika, który nie wie nic o zakresie sesji Flask-SQLAlchemy jest zdecydowanie koniecznością!
schlamar
16

Dokumentacja SQLAlchemy jasno stwierdza, że ​​powinieneś używać Flask-SQLAlchemy (zwłaszcza jeśli nie rozumiesz jego zalet!):

[...] produkty, takie jak Flask-SQLAlchemy [...] SQLAlchemy zdecydowanie zaleca, aby te produkty były używane jako dostępne.

Ten cytat i szczegółową motywację można znaleźć w drugim pytaniu sesji FAQ .

schlamar
źródło
2
Wydaje się, że Flask-sqlalchemy nie jest konserwowana. Ostatnia aktualizacja miała miejsce 1 sierpnia 2013 r. Czy ta rada jest już aktualna?
pmav99
@ pmav99 tak długo, jak nie masz z nim konkretnych problemów, nadal polecałbym go, szczególnie nowym użytkownikom.
schlamar
1
Wydaje się, że jest aktywnie utrzymywany od listopada 2014 r. Wiele ostatnich zatwierdzeń. github.com/mitsuhiko/flask-sqlalchemy/commits/master
Steve Bennett
26
Mimo że OP nie zapytał o to bezpośrednio, imo. chciał poznać zalety Flask-SQLAlchemy. Twoja odpowiedź brzmi dosłownie „używaj go, nawet jeśli nie wiesz, jakie są korzyści” - tak, jakie są korzyści?
Markus Meskanen
1
Ta odpowiedź nie odpowiada na pytanie PO. Zalecasz flask-sqlalchemy, bez podania zbyt wielu uzasadnień za zaleceniem.
mbadawi23
7

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

Model.query.all()

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.

Mike Waites
źródło
1
„Na przykład, powiedzmy, że chcemy pobrać wszystkie rekordy z tabeli przy użyciu modelu używającego Flask-Sqlalchemy. To tak proste, jak Model.query.all()„ - to wszystko można zrobić tylko za pomocą SQLAlchemy, użycie Flask-SQLAlchemy nie zapewnia tutaj absolutnie nic nowego.
Markus Meskanen
jesteś niesamowity! Natknąłem się na ten post i rozwiązał problem, który miałem. po zainstalowaniu anacondy z jakiegoś powodu normalne aktualizacje nie działały. zmieniono z Model.query.all()na db.session.query(Model).all()z jakiegoś powodu, co umożliwiło normalne śledzenie i aktualizowanie sesji.
Jeff Bluemel
2

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.

2-złożone
źródło