1.5.6.5 Query Data - dvrg/flask-web-development GitHub Wiki
Flask-SQLAlchemy bisa memperlihatkan semua data pada database dengan metode all()
flask shell
>>> Role.query.all()
[<Role Administrator’>, <Role User>]
>>> User.query.all()
[<User david>, <User teguh>, <User sabil>]
Flask-SQLAlchemy juga bisa memperlihatkan semua data pada database dengan mem-filter data pada database dengan filter_by()
:
>>> User.query.filter_by(role=user_role).all()
[<User teguh>, <User sabil>]
Kamu juga bisa untuk mengecek query SQL yang dihasilkan SQLALchemy:
>>> str(User.query.filter_by(role=user_role))
'SELECT users.id AS users_id, users.username AS users_username, users.role_id AS users_role_id \nFROM users \nWHERE %(param_1)s
= users.role_id'
Jika kamu keluar dari flask-shell
maka objek-objek yang sebelumnya akan hilang selain yang sudah di commit. Data yang sudah dicommit akan tersimpan di database. Jika kamu membuka shell baru maka kamu kamu harus import ulang dari app. Nah, jika kamu ingin mengambil data pertama dari database maka gunakan metode first()
:
>>> user_role = Role.query.filter_by(name='User').first()
metode first()
mengambil data pertama dari id tabel Role.
Beberapa perintah query filters:
Option | Deksripsi |
---|---|
filter() |
Memfilter sesuai |
filter_by() |
Memfilter dengan nilai kesamaan |
limit() |
Membatasi jumlah hasil query |
offset() |
Menerapkan offset ke hasil query |
order_by() |
Mengurutkan data sesuai dengan nilai yang diberikan |
group_by() |
Mengelompokkan hasil data sesuai dengan nilai yang diberikan |
Beberapa perintah query SQLAlchemy:
Option | Deskripsi |
---|---|
all() |
Mengeluarkan seluruh data |
first() |
Mengeluarkan data pertama |
first_or_404() |
Mengelurakan data pertama, namun jika data tidak ada akan mengirim 404 sebagai respon |
get() |
Mengembalikan data sesuai id yang diberikan |
get_or_404() |
Mengembailkan data sesuai id yang diberikan, namun jika data tidak ada akan mengirim 404 sebagai respon |
count() |
Menghitung data |
paginate() |
Membuat paginate sesuai range |
SQLAlchemy relationship mirip dengan query. Contoh hubungan one-to-many antara role dan user:
>>> users = user_role.users
>>> users
[<User teguh>, <User sabil>]
>>> users[0].role
<Role User>
lazy='dynamic'
berfungsi untuk query tidak dieksekusi secara otomatis:
# app.py
...
# Model
class Role(db.Model):
__tablename__ = 'roles'
...
users = db.relationship('User', backref='role', lazy='dynamic')
...
dengan relasi seperti ini, jadi filter bisa ditambahkan, tapi sebelum menjalankan perintah di bawah pastikan kamu reload flask shell kamu:
>>> user_role.users.order_by(User.username).all()
[<User david>, <User susan>]
>>> user_role.users.count()
2