flask-sqlalchemy atau sqlalchemy

95

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.

Amin
sumber
6
Hmm, masih belum ada jawaban yang memuaskan di sini. Siapa pun dapat menjelaskan apa manfaat konkret sebenarnya flask-sqlalchemylebih tua polos sqlalchemydalam aplikasi Flask?
Steve Bennett
Satu kelemahan besar adalah, Flask-SqlAlchemytidak menyediakan cara apa pun untuk mengatur multi-tenancy dalam aplikasi. Itu adalah negatif terbesar IMO. bindsdisediakan hanya untuk melampirkan database yang berbeda ke model yang berbeda, sementara tidak ada cara untuk menggunakan database khusus penyewa dengan model yang sama.
Rohit Jain

Jawaban:

70

Fitur utama dari Flask-SQLAlchemyintegrasi 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-SQLAlchemydan tidak menggunakan fitur tambahan apa pun yang disediakannya. Anda akan memiliki db.sessiondan Anda dapat menggunakannya seolah-olah itu adalah SQLAlchemypengaturan murni .

Boris Serebrov
sumber
4
Saya tetap bingung. Posting blog yang ditautkan (dan dokumen resmi!) Mencantumkan beberapa fitur SQLAlchemy biasa (seperti basis deklaratif) seolah-olah itu adalah fitur Flask-SQLAlchemy; tidak jelas apakah mereka mengambil kredit untuk hal-hal yang dibangun ke dalam SQLAlchemy atau mereka telah menerapkannya kembali (atau mengapa mereka melakukannya, jika yang terakhir). Paragraf pertama Anda mencantumkan dua fitur: pembungkus kenyamanan untuk manajemen sesi (tetapi Anda tidak perlu menggulir sendiri jika Anda ingin menggunakan model SQLAlchemy di luar Flask?) Dan beberapa "konfigurasi" yang tidak ditentukan untuk "bekerja dengan aplikasi Flask" . Apa itu berarti ?
Mark Amery
1
Saya juga agak bingung dengan pertanyaan. Posting blog yang ditautkan adalah IMO yang cukup jelas, misalnya, dikatakan "Model dasar deklaratif kustom dengan dukungan untuk properti kueri dan pagination" kuncinya adalah "kustom" dan "dengan dukungan untuk properti kueri dan pagination" adalah apa yang ditambahkannya di atas Basis deklaratif SQLAlchemy.
Boris Serebrov
1
Mengenai "pembungkus kenyamanan" - mereka bukan untuk kenyamanan, tetapi untuk membuat segala sesuatunya berfungsi dengan baik. Untuk mulai menggunakan SQLAlchemy, Anda memerlukan objek koneksi database (eninge / connection / session) dan Anda tidak ingin membuatnya setiap kali Anda perlu membuat kueri SQL, jadi ini harus dibuat secara global dan tersedia di seluruh kode aplikasi. Jadi Anda dapat melakukan sesuatu seperti "dari aplikasiAnda, import db", lalu lakukan "db.session.something ()" tanpa memikirkan cara membuat dan menginisialisasi objek "db" ini dengan benar.
Boris Serebrov
Dan mengenai "konfigurasi" yang tidak ditentukan untuk "bekerja dengan aplikasi Flask" - ini sebenarnya ditentukan di paragraf kedua: 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 .
Boris Serebrov
22

Flask-SQLAlchemy memberi Anda sejumlah tambahan bagus yang pada akhirnya akan Anda implementasikan sendiri menggunakan SQLAlchemy.

Sisi positif dari penggunaan Flask-SQLAlchemy


  1. Flask_SQLAlchemy menangani konfigurasi sesi, pengaturan dan pembongkaran untuk Anda.
  2. Memberi Anda model dasar deklaratif yang mempermudah pembuatan kueri dan penomoran halaman
  3. Pengaturan khusus backend. Flask-SQLAlchemy memindai lib yang diinstal untuk dukungan Unicode dan jika gagal secara otomatis menggunakan SQLAlchemy Unicode.
  4. Memiliki metode yang disebut apply_driver_hacksyang secara otomatis menetapkan default yang waras ke thigs seperti ukuran kolam MySQL
  5. Memiliki metode build yang bagus create_all () dan drop_all () untuk membuat dan menjatuhkan semua tabel. Berguna untuk pengujian dan di baris perintah python jika Anda melakukan sesuatu yang bodoh
  6. Ini memberi Anda get_or_404 () daripada get () dan find_or_404 () alih-alih contoh kode find () di> http://flask-sqlalchemy.pocoo.org/2.1/queries/

Tetapkan nama tabel secara otomatis. Flask-SQLAlchemy secara otomatis mengeset nama tabel Anda dan mengonversi Anda ClassName> class_nameini bisa diganti dengan menyetel __tablename__class List item

Sisi negatif dari penggunaan Flask-SQLAlchemy


  1. Menggunakan Flask-SQLAlchemy akan menambah kesulitan untuk migrasi dari Flask ke katakanlah Pyramid jika Anda perlu. Hal ini terutama karena model dasar deklaratif kustom di Flask_SQLAchemy.
  2. Menggunakan Flask-SQLAlchemy, Anda berisiko menggunakan paket dengan komunitas yang jauh lebih kecil daripada SQLAlchemy itu sendiri, yang tidak dapat saya hilangkan dengan mudah dari pengembangan aktif dalam waktu dekat.
  3. Beberapa tambahan bagus yang dimiliki Flask-SQLAlchemy dapat membuat Anda bingung jika Anda tidak tahu mereka ada di sana.
Kimmo Hintikka
sumber
21

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.

MOCKBA
sumber
6
Ya, dalam kasus penggunaan Anda Flask-SQLAlchemy sepertinya sudah usang. Tetapi jika OP memiliki skenario seperti itu, dia mungkin tidak akan menanyakan pertanyaan ini. Untuk pengguna baru yang tidak tahu apa-apa tentang cakupan sesi, Flask-SQLAlchemy adalah suatu keharusan!
schlamar
16

Dokumentasi SQLAlchemy dengan jelas menyatakan bahwa Anda harus menggunakan Flask-SQLAlchemy (terutama jika Anda tidak memahami manfaatnya!):

[...] produk seperti Flask-SQLAlchemy [...] SQLAlchemy sangat menyarankan agar produk ini digunakan sebagaimana tersedia.

Kutipan dan motivasi terperinci ini dapat Anda temukan di pertanyaan kedua di FAQ Sesi .

schlamar.dll
sumber
2
Flask-sqlalchemy tampaknya tidak terawat. Pembaruan terakhir pada tanggal 1 Agustus 2013. Apakah nasihat ini relevan lagi?
pmav99
@ pmav99 selama Anda tidak memiliki masalah konkret dengannya, saya akan tetap merekomendasikannya, terutama untuk pengguna baru.
schlamar
1
Tampaknya dipertahankan secara aktif mulai November 2014. Banyak komitmen baru-baru ini. github.com/mitsuhiko/flask-sqlalchemy/commits/master
Steve Bennett
26
Meski OP tidak menanyakannya secara langsung, imo. dia ingin mengetahui manfaat dari Flask-SQLAlchemy. Jawaban Anda secara harfiah adalah "gunakan meskipun Anda tidak tahu apa manfaatnya" - ya, apa manfaatnya?
Markus Meskanen
1
Jawaban ini tidak menjawab pertanyaan OP. Anda merekomendasikan flask-sqlalchemy, tanpa memberikan banyak alasan di balik rekomendasi tersebut.
mbadawi23
7

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

Model.query.all()

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.

Mike Waites
sumber
1
"Sebagai contoh, katakanlah kita ingin mengambil semua record dari tabel menggunakan model yang menggunakan Flask-Sqlalchemy. Semudah Model.query.all()" - ini semua dapat dilakukan hanya dengan SQLAlchemy, menggunakan Flask-SQLAlchemy sama sekali tidak memberikan hal baru di sini.
Markus Meskanen
kamu Menakjubkan! Saya menemukan posting ini dan itu memecahkan masalah yang saya alami. setelah saya menginstal anaconda, untuk beberapa alasan pembaruan normal tidak berfungsi. diubah dari Model.query.all()menjadi db.session.query(Model).all()karena alasan tertentu memungkinkan sesi untuk dilacak dan diperbarui seperti biasa.
Jeff Bluemel
2

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.

2-kompleks
sumber