Saya baru di flask dan sqlalchemy, saya baru mulai mengerjakan aplikasi flask, dan saya menggunakan sqlalchemy untuk saat ini. Saya bertanya-tanya apakah ada manfaat signifikan yang bisa saya dapatkan dari penggunaan flask-sqlalchemy vs sqlalchemy. Saya tidak dapat menemukan cukup motivasi di http://packages.python.org/Flask-SQLAlchemy/index.html atau mungkin saya tidak mengerti nilainya !! Saya sangat menghargai klarifikasi Anda.
95
flask-sqlalchemy
lebih tua polossqlalchemy
dalam aplikasi Flask?Flask-SqlAlchemy
tidak menyediakan cara apa pun untuk mengatur multi-tenancy dalam aplikasi. Itu adalah negatif terbesar IMO.binds
disediakan hanya untuk melampirkan database yang berbeda ke model yang berbeda, sementara tidak ada cara untuk menggunakan database khusus penyewa dengan model yang sama.Jawaban:
Fitur utama dari
Flask-SQLAlchemy
integrasi yang tepat dengan aplikasi Flask - ia membuat dan mengkonfigurasi mesin, koneksi dan sesi dan mengkonfigurasinya untuk bekerja dengan aplikasi Flask.Setup ini cukup kompleks karena kita perlu membuat sesi terbatas dan menanganinya dengan benar sesuai dengan siklus hidup permintaan / respon aplikasi Flask.
Dalam dunia ideal itu akan menjadi satu-satunya fitur
Flask-SQLAlchemy
, tetapi sebenarnya itu menambahkan beberapa hal lagi. Berikut adalah posting blog yang bagus dengan ikhtisar dari mereka: Demystifying Flask-SQLAlchemy .Ketika saya pertama kali bekerja dengan Flask dan SQLAlchemy, saya tidak suka overhead ini. Saya pergi dan mengekstrak kode manajemen sesi dari ekstensi. Pendekatan ini berhasil, meskipun saya menemukan bahwa cukup sulit untuk melakukan integrasi ini dengan benar.
Jadi pendekatan yang lebih mudah (yang digunakan dalam proyek lain yang sedang saya kerjakan) adalah dengan mampir
Flask-SQLAlchemy
dan tidak menggunakan fitur tambahan apa pun yang disediakannya. Anda akan memilikidb.session
dan Anda dapat menggunakannya seolah-olah itu adalahSQLAlchemy
pengaturan murni .sumber
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.
Lihat detail selengkapnya di dokumen SQLAlchemy: Kapan saya membuat Sesi, kapan saya melakukannya, dan kapan saya melakukannya tutup itu? dan Sesi Kontekstual / Thread-local .Flask-SQLAlchemy memberi Anda sejumlah tambahan bagus yang pada akhirnya akan Anda implementasikan sendiri menggunakan SQLAlchemy.
Sisi positif dari penggunaan Flask-SQLAlchemy
apply_driver_hacks
yang secara otomatis menetapkan default yang waras ke thigs seperti ukuran kolam MySQLTetapkan nama tabel secara otomatis. Flask-SQLAlchemy secara otomatis mengeset nama tabel Anda dan mengonversi Anda
ClassName
>class_name
ini bisa diganti dengan menyetel__tablename__
class List itemSisi negatif dari penggunaan Flask-SQLAlchemy
sumber
Sejujurnya, saya tidak melihat manfaat apa pun. IMHO, Flask-SQLAlchemy membuat lapisan tambahan yang tidak terlalu Anda butuhkan. Dalam kasus kami, kami memiliki aplikasi Flask yang cukup kompleks dengan banyak database / koneksi (master-slave) menggunakan ORM dan Core di mana, antara lain, kami perlu mengontrol sesi / transaksi DB kami (misalnya mode dryrun vs commit). Flask-SQLAlchemy menambahkan beberapa fungsionalitas tambahan seperti penghancuran otomatis sesi dengan asumsi beberapa hal untuk Anda yang seringkali bukan yang Anda butuhkan.
sumber
Dokumentasi SQLAlchemy dengan jelas menyatakan bahwa Anda harus menggunakan Flask-SQLAlchemy (terutama jika Anda tidak memahami manfaatnya!):
Kutipan dan motivasi terperinci ini dapat Anda temukan di pertanyaan kedua di FAQ Sesi .
sumber
seperti yang disarankan @schlamar, Flask-SqlAlchemy jelas merupakan hal yang baik. Saya hanya ingin menambahkan beberapa konteks ekstra ke poin yang dibuat di sana.
Jangan merasa seperti Anda memilih salah satu dari yang lain. Sebagai contoh katakanlah kita ingin mengambil semua record dari sebuah tabel menggunakan model yang menggunakan Flask-Sqlalchemy. Sesederhana itu
Untuk banyak kasus sederhana Flask-Sqlalchemy akan baik-baik saja. Poin tambahan yang ingin saya sampaikan adalah, jika Flask-Sqlalchemy tidak dapat melakukan apa yang Anda inginkan maka tidak ada alasan Anda tidak dapat menggunakan SqlAlchemy secara langsung.
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()
Seperti yang Anda lihat, kita dapat dengan mudah melompat dari satu ke yang lain tanpa masalah dan pada contoh kedua kita sebenarnya menggunakan model yang ditentukan Flask-Sqlalchemy.
sumber
Model.query.all()
" - ini semua dapat dilakukan hanya dengan SQLAlchemy, menggunakan Flask-SQLAlchemy sama sekali tidak memberikan hal baru di sini.Model.query.all()
menjadidb.session.query(Model).all()
karena alasan tertentu memungkinkan sesi untuk dilacak dan diperbarui seperti biasa.Berikut adalah contoh manfaat yang diberikan flask-sqlalchemy lebih dari sqlalchemy biasa.
Misalkan Anda menggunakan flask_user.
flask_user mengotomatiskan pembuatan dan otentikasi objek pengguna, sehingga perlu mengakses database Anda. Kelas UserManager melakukan ini dengan memanggil sesuatu yang disebut "adapter" yang mengabstraksi panggilan database. Anda menyediakan adaptor di konstruktor UserManager, dan adaptor harus mengimplementasikan fungsi-fungsi ini:
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
Jika Anda menggunakan flask-sqlalchemy, Anda dapat menggunakan SQLAlchemyAdapter bawaan. Jika Anda menggunakan sqlalchemy (bukan-flask-sqlalchemy), Anda mungkin membuat asumsi yang berbeda tentang cara penyimpanan objek ke database (seperti nama tabel) sehingga Anda harus menulis kelas adaptor Anda sendiri.
sumber