flask-sqlalchemy veya sqlalchemy


95

Hem flask hem de sqlalchemy'de yeniyim, bir flask uygulaması üzerinde çalışmaya başladım ve şimdilik sqlalchemy kullanıyorum. Flask-sqlalchemy'yi sqlalchemy'ye karşı kullanmaktan elde edebileceğim önemli bir fayda olup olmadığını merak ediyordum. Http://packages.python.org/Flask-SQLAlchemy/index.html'de yeterli motivasyon bulamadım veya belki değeri anlamadım !! Açıklamalarınızı takdir ediyorum.


6
Hmm, burada hala tatmin edici bir cevap yok. Bir Flask uygulamasının flask-sqlalchemyeski somut faydalarının ne olduğunu kimse açıklayabilir sqlalchemymi?
Steve Bennett

Yine de büyük bir dezavantaj Flask-SqlAlchemy, uygulamada çok kiracılı kurulum için herhangi bir yol sağlamamasıdır. Bu IMO'nun en büyük olumsuzudur. bindsyalnızca, farklı bir veritabanını farklı modele eklemektir, ancak kiracıya özel veritabanını aynı modelle kullanmanın bir yolu yoktur.
Rohit Jain

Yanıtlar:


70

Temel özelliği, Flask-SQLAlchemyFlask uygulamasıyla uygun entegrasyondur - motoru, bağlantıyı ve oturumu oluşturur ve yapılandırır ve Flask uygulamasıyla çalışacak şekilde yapılandırır.

Kapsamlı oturumu oluşturmamız ve bunu Flask uygulama isteği / yanıt yaşam döngüsüne göre düzgün bir şekilde işlememiz gerektiğinden, bu kurulum oldukça karmaşıktır .

İdeal dünyada tek özelliği olacak Flask-SQLAlchemy, ama aslında birkaç şey daha ekliyor. İşte bunlara genel bir bakış içeren iyi bir blog yazısı: Demystifying Flask-SQLAlchemy .

Flask ve SQLAlchemy ile ilk çalıştığımda, bu ek yükü beğenmedim. Gittim ve uzantıdan oturum yönetimi kodunu çıkardım. Bu entegrasyonu düzgün yapmanın oldukça zor olduğunu keşfetmiş olsam da bu yaklaşım işe yarıyor.

Bu yüzden (üzerinde çalıştığım başka bir projede kullanılan) daha kolay yaklaşım, sadece içeri girmek Flask-SQLAlchemyve sağladığı ek özelliklerin hiçbirini kullanmamaktır. Sahip olacaksınız db.sessionve onu saf bir SQLAlchemykurulummuş gibi kullanabilirsiniz .


4
Kafam karışık. Bağlantılı blog gönderisi (ve resmi belgeler!), Bazı düz SQLAlchemy özelliklerini (bildirim temelli gibi) Flask-SQLAlchemy özellikleriymiş gibi listeler; SQLAlchemy'de yerleşik olan şeyler için kredi alıp almadıkları veya onu yeniden uygulayıp uygulamadıkları (ya da ikincisi ise neden bunu yaptıkları) açık değil. İlk paragrafınız iki özelliği listeler: oturum yönetimi için kolaylık sarmalayıcılar (ancak SQLAlchemy modellerinizi Flask dışında kullanmak istiyorsanız yine de kendi başınıza almanız gerekmeyecek mi?) Ve "Flask uygulamasıyla çalışmak " için bazı belirtilmemiş "yapılandırma " . Bu ne anlama geliyor ?
Mark Amery

1
Sorulardan da biraz kafam karıştı. Bağlantılı blog yazısı oldukça açık bir IMO, örneğin, "Sorgu özelliği ve sayfalandırma desteği ile özel bildirim temelli temel model" diyor, anahtar "özel" ve "sorgu özelliği ve sayfalandırma desteği ile" SQLAlchemy'nin bildirim tabanı.
Boris Serebrov

1
"Kolaylık paketi" ile ilgili olarak - bunlar kolaylık sağlamak için değil, işlerin düzgün çalışmasını sağlamak içindir. SQLAlchemy'yi kullanmaya başlamak için veritabanı bağlantısı (bağlantı / bağlantı / oturum) nesnelerine ihtiyacınız vardır ve bunları her SQL sorgusu yapmanız gerektiğinde oluşturmak istemezsiniz, bu nedenle bunlar global olarak oluşturulmalı ve uygulama kodunda kullanılabilir olmalıdır. Böylece, "uygulamanızdan içe aktarma db" gibi bir şey yapabilir ve sonra bu "db" nesnesini doğru şekilde nasıl oluşturup başlatacağınızı düşünmeden "db.session.something ()" yapabilirsiniz.
Boris Serebrov

Ve "Flask uygulamasıyla çalışmak" için belirtilmemiş "yapılandırma" ile ilgili olarak - aslında ikinci paragrafta belirtilmiştir: 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.Daha fazla ayrıntı için SQLAlchemy belgelerine bakın: Bir Oturum ne zaman oluşturacağım, ne zaman gerçekleştireceğim ve ne zaman yapacağım kapat onu? ve Bağlamsal / Konu Yerel Oturumlar .
Boris Serebrov

22

Flask-SQLAlchemy size SQLAlchemy kullanarak kendinizi uygulayacağınız bir dizi güzel ekstra verir.

Flask-SQLAlchemy kullanmanın olumlu yönleri


  1. Flask_SQLAlchemy sizin için oturum yapılandırma, kurulum ve sökme işlemlerini gerçekleştirir.
  2. Sorgulamayı ve sayfalandırmayı kolaylaştıran bildirim temelli temel model sunar
  3. Arka uç özel ayarlar: Flask-SQLAlchemy, Unicode desteği için yüklü kitaplıkları tarar ve başarısız olursa otomatik olarak SQLAlchemy Unicode kullanır.
  4. apply_driver_hacksMySQL havuz boyutu gibi mantıklı varsayılanları otomatik olarak ayarlayan bir yöntemi vardır
  5. Tüm tabloları oluşturmak ve bırakmak için create_all () ve drop_all () yöntemlerinde güzel bir yapıya sahiptir. Aptalca bir şey yaptıysanız test etmek için ve python komut satırında kullanışlıdır
  6. Find () yerine get () yerine get_or_404 () ve> http://flask-sqlalchemy.pocoo.org/2.1/queries/ adresindeki find () Kod örneği yerine find_or_404 () verir.

Tablo adlarını otomatik olarak ayarlayın. Flask-SQLAlchemy, tablo adlarınızı otomatik olarak ayarlar ve ClassName> class_namebu, __tablename__liste öğesi sınıfını ayarlayarak geçersiz kılınabilir

Flask-SQLAlchemy kullanmanın olumsuz yönleri


  1. Flask-SQLAlchemy'yi kullanmak, ihtiyacınız olursa Flask'tan Piramit'e geçişte ek zorluklar yaratacaktır. Bunun başlıca nedeni Flask_SQLAchemy'deki özel bildirim temelli temel modeldir.
  2. Flask-SQLAlchemy'yi kullanarak, SQLAlchemy'nin kendisinden çok daha küçük bir topluluğa sahip bir paket kullanma riskiyle karşı karşıya kalırsınız, ki bunu yakın zamanda aktif geliştirmeden kolayca çıkaramayacağım.
  3. Flask-SQLAlchemy'nin sahip olduğu bazı güzel ekstralar, orada olduklarını bilmiyorsanız kafanızı karıştırabilir.

21

Dürüst olmak gerekirse, herhangi bir fayda görmüyorum. IMHO, Flask-SQLAlchemy gerçekten ihtiyacınız olmayan ek bir katman oluşturur. Bizim durumumuzda, hem ORM hem de Core kullanan çoklu veritabanları / bağlantıları (master-slave) içeren oldukça karmaşık bir Flask uygulamasına sahibiz; burada, diğer şeylerin yanı sıra, oturumlarımızı / DB işlemlerimizi kontrol etmemiz gerekir (örneğin, dryrun ve commit modları). Flask-SQLAlchemy, sizin için bazı şeyleri varsayarak oturumun otomatik olarak yok edilmesi gibi bazı ek işlevler ekler ki bu çoğu zaman ihtiyacınız olan şey değildir.


6
Evet, sizin kullanım durumunuzda Flask-SQLAlchemy eski görünüyor. Ancak OP'nin böyle bir senaryosu varsa, muhtemelen bu soruyu sormayacaktır. Oturum kapsamı hakkında hiçbir şey bilmeyen yeni bir kullanıcı için Flask-SQLAlchemy kesinlikle bir zorunluluktur!
schlamar

16

SQLAlchemy dokümantasyonu, Flask-SQLAlchemy kullanmanız gerektiğini açıkça belirtir (özellikle faydalarını anlamıyorsanız!):

[...] Flask-SQLAlchemy gibi ürünler [...] SQLAlchemy, bu ürünlerin mevcut haliyle kullanılmasını şiddetle tavsiye eder.

Bu alıntı ve ayrıntılı bir motivasyon Oturum SSS'nin ikinci sorusunda bulabilirsiniz .


2
Flask-sqlalchemy bakılmamış gibi görünüyor. Son güncelleme 1 Ağustos 2013 tarihinde yapıldı. Bu tavsiye artık geçerli mi?
pmav99

@ pmav99, onunla ilgili somut sorunlar yaşamadığınız sürece, özellikle yeni kullanıcılar için yine de tavsiye ederim.
schlamar

1
Kasım 2014 itibarıyla aktif olarak sürdürülmüş görünüyor. Son zamanlarda yapılan çok sayıda taahhüt. github.com/mitsuhiko/flask-sqlalchemy/commits/master
Steve Bennett

26
OP doğrudan sormasa da, imo. Flask-SQLAlchemy'nin faydalarını bilmek istiyordu. Cevabınız kelimenin tam anlamıyla "faydalarının ne olduğunu bilmeseniz bile onu kullanın" - evet, faydaları nelerdir?
Markus Meskanen

1
Bu cevap OP'nin sorusuna cevap vermiyor. Tavsiyenin arkasında fazla bir gerekçe göstermeden, matara-sqlalchemy'yi öneriyorsunuz.
mbadawi23

7

@schlamar'ın önerdiği gibi Flask-SqlAlchemy defo iyi bir şeydir. Ben sadece orada belirtilen noktaya ekstra bağlam eklemek istiyorum.

Birini diğerine tercih ediyormuş gibi hissetme. Örneğin, Flask-Sqlalchemy kullanan bir model kullanarak bir tablodaki tüm kayıtları almak istediğimizi varsayalım. Kadar basit

Model.query.all()

Birçok basit durumda, Flask-Sqlalchemy tamamen iyi olacak. Yapmak istediğim ekstra nokta, eğer Flask-Sqlalchemy istediğinizi yapmayacaksa, SqlAlchemy'yi doğrudan kullanamamanız için hiçbir sebep yok.

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()

Gördüğünüz gibi sorunsuz bir şekilde birinden diğerine atlayabiliriz ve ikinci örnekte aslında Flask-Sqlalchemy tanımlı modelleri kullanıyoruz.


1
"Örneğin, Flask-Sqlalchemy kullanan bir model kullanarak bir tablodaki tüm kayıtları almak istediğimizi varsayalım. Bu kadar basit Model.query.all()" - bunların hepsi yalnızca SQLAlchemy ile yapılabilir , Flask-SQLAlchemy burada kesinlikle yeni bir şey sağlamaz.
Markus Meskanen

müthişsin! Bu gönderiye rastladım ve yaşadığım bir sorunu çözdüm. anaconda'yı kurduktan sonra, nedense normal güncellemeler çalışmıyordu. değiştirilen Model.query.all()için db.session.query(Model).all()seans izlemesine olanak sağladı ve normal olarak güncellenen nedense.
Jeff Bluemel

2

İşte size basit sqlalchemy üzerinden bir fayda şişesi-sqlalchemy'nin bir örneği.

Flask_user kullandığınızı varsayalım.

flask_user, kullanıcı nesnelerinin oluşturulmasını ve kimlik doğrulamasını otomatikleştirir, bu nedenle veritabanınıza erişmesi gerekir. UserManager sınıfı bunu, veritabanı çağrılarını özetleyen "adaptör" adı verilen bir şeyi çağırarak yapar. UserManager yapıcısında bir adaptör sağlarsınız ve adaptör şu işlevleri uygulamalıdır:

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

Flask-sqlalchemy kullanıyorsanız, yerleşik SQLAlchemyAdapter'ı kullanabilirsiniz. Sqlalchemy (flask-sqlalchemy değil) kullanıyorsanız, nesnelerin veritabanına kaydedilme şekli hakkında farklı varsayımlar yapabilirsiniz (tabloların adları gibi), bu nedenle kendi adaptör sınıfınızı yazmanız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.