Web2py - Lapisan Abstraksi Database

Itu Database Abstraction Layer (DAL)dianggap sebagai kekuatan utama web2py. DAL memperlihatkan Application Programming Interface (API) sederhana ke sintaks SQL yang mendasarinya.

Dalam bab ini, kita akan mengetahui aplikasi non-sepele DAL, seperti membangun kueri untuk mencari berdasarkan tag secara efisien dan membangun pohon kategori hierarki.

Beberapa fitur penting DAL adalah -

  • web2py menyertakan Database Abstraction Layer (DAL), API yang memetakan objek Python ke dalam objek database. Objek database bisa berupa kueri, tabel, dan catatan.

  • DAL secara dinamis menghasilkan SQL dalam waktu nyata menggunakan dialek yang ditentukan untuk back end database, sehingga pengembang tidak wajib menulis kueri SQL lengkap.

  • Keuntungan utama menggunakan DAL adalah bahwa aplikasi akan portabel dengan berbagai jenis database.

Memulai DAL

Sebagian besar aplikasi di web2py memerlukan koneksi database. Oleh karena itu, membangun model database merupakan langkah awal dalam perancangan sebuah aplikasi.

Pertimbangkan aplikasi yang baru dibuat bernama “helloWorld”. Basis data diimplementasikan di bawah Model aplikasi. Semua model untuk masing-masing aplikasi terdiri dari file bernama -models/db_custom.py.

Langkah-langkah berikut digunakan untuk mengimplementasikan DAL -

Langkah 1 - Pembuat DAL

Buat koneksi database. Ini dibuat menggunakan objek DAL yang juga disebut konstruktor DAL.

db = DAL ('sqlite://storage.sqlite')

Fitur penting dari DAL adalah memungkinkan beberapa koneksi dengan database yang sama atau dengan database yang berbeda, bahkan dengan tipe database yang berbeda. Teramati bahwa baris ini sudah ada di filemodels/db.py. Oleh karena itu, Anda mungkin tidak memerlukannya, kecuali Anda menghapusnya atau perlu menyambungkan ke database yang berbeda. Secara default, web2py terhubung ke database SQLite yang disimpan dalam filestorage.sqlite.

File ini terletak di folder database aplikasi. Jika file tidak ada, itu dibuat oleh web2py saat aplikasi pertama kali dijalankan.

SQLite cepat, dan menyimpan semua data dalam satu file. Artinya, data Anda dapat dengan mudah ditransfer dari satu aplikasi ke aplikasi lainnya. Faktanya, database SQLite dikemas oleh web2py bersama dengan aplikasi. Ini memberikan dukungan SQL penuh, termasuk terjemahan, gabungan, dan agregat.

Ada dua kelemahan SQLite.

  • Salah satunya adalah tidak memberlakukan tipe kolom, dan tidak ada ALTER TABLE kecuali untuk menambah dan menghapus kolom.

  • Kerugian lainnya adalah seluruh database dikunci oleh setiap transaksi yang membutuhkan akses tulis.

Langkah 2 - Pembuat Meja

Setelah koneksi dengan database dibuat, kita dapat menggunakan file define_table metode untuk mendefinisikan tabel baru.

Misalnya -

db.define_table('invoice',Field('name'))

Metode di atas juga digunakan di antara konstruktor Tabel. Sintaks untuk konstruktor tabel sama. Argumen pertama adalah nama tabel, dan diikuti oleh daftarField(s). Konstruktor bidang mengambil argumen berikut -

Sr Tidak Argumen & Penggunaan
1

The field name

Nama bidang dalam tabel.

2

The field type

mengambil nilai yang memiliki salah satu tipe data seperti string (default), teks, boolean, integer, dan sebagainya.

3

Length

Menentukan panjang maksimum.

4

default = None

Ini adalah nilai default ketika record baru dimasukkan.

5

update = None

Ini berfungsi sama seperti default, tetapi nilainya hanya digunakan pada pembaruan, bukan pada penyisipan.

6

Notnull

Ini menentukan apakah nilai bidang bisa NULL atau tidak.

7

readable = True

Ini menentukan apakah bidang dapat dibaca dalam formulir atau tidak.

8

writable = True

Ini menentukan apakah bidang dapat ditulis dalam formulir atau tidak.

9

label = "Field Name"

Ini adalah label yang akan digunakan untuk bidang ini di formulir.

Itu define_table metode juga mengambil tiga argumen bernama -

Sintaksis

db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
  • migrate = True - Ini menginstruksikan web2py untuk membuat tabel jika tidak ada, atau mengubahnya jika tidak cocok dengan definisi model.

  • fake_migrate = False - Jika model cocok dengan isi tabel database, maka atur fake_migrate = True yang membantu web2py untuk membangun kembali data.

  • format = '%(id)s' - Ini adalah format string yang menentukan bagaimana record pada tabel tertentu harus direpresentasikan.

Menghasilkan SQL Mentah

Dengan menggunakan DAL, kita dapat membuat koneksi ke database dan membuat tabel baru dan bidangnya menggunakan konstruktor tabel dan konstruktor lapangan.

Terkadang, pernyataan SQL perlu dibuat agar sesuai dengan keluaran yang diperlukan. web2py menyertakan berbagai fungsi, yang membantu dalam menghasilkan SQL mentah, yang diberikan sebagai berikut -

_memasukkan

Ini membantu dalam mengambil pernyataan insert untuk tabel yang diberikan. Sebagai contoh,

print db.person._insert(name ='ABC')

Ini akan mengambil pernyataan insert untuk tabel bernama "person".

Keluaran pernyataan SQL -

INSERT INTO person(name) VALUES ('ABC');

_menghitung

Ini membantu dalam mengambil pernyataan SQL, yang memberikan jumlah catatan. Misalnya, pertimbangkan tabel bernama 'orang' dan kita perlu menemukan jumlah orang dengan nama 'ABC'.

print db(db.person.name ==' ABC ')._count()

Keluaran pernyataan SQL -

SELECT count(*) FROM person WHERE person.name = ' ABC ';

_Pilih

Ini membantu dalam mengambil pernyataan SQL tertentu. Sebagai contoh, perhatikan tabel bernama 'person' dan kita perlu mencari daftar orang dengan nama 'ABC'.

print db(db.person.name == ' ABC ')._select()

Keluaran pernyataan SQL -

SELECT person.name FROM person WHERE person.name = ' ABC ';

_menghapus

Ini membantu dalam mengambil delete SQLpernyataan. Misalnya, pertimbangkan untuk tabel bernama 'person' dan kita perlu menghapus pernyataan dengan nama 'ABC'

print db(db.person.name == ' ABC ')._delete()

Keluaran pernyataan SQL -

DELETE FROM person WHERE person.name = ' ABC ';4

_memperbarui

Ini membantu dalam mengambil pernyataan SQL yang diperbarui. Misalnya, pertimbangkan untuk tabel bernama 'person' dan kami perlu memperbarui nama kolom dengan beberapa nilai lain.

print db(db.person.name == ' ABC ')._update()

Keluaran pernyataan SQL -

UPDATE person SET WHERE person.name = ’Alex’;

Masalah terkait DAL (Gotchas)

SQLite

SQLite tidak memiliki dukungan untuk menghapus atau mengubah kolom. Menghapus bidang dari tabel membuatnya tetap aktif dalam database, karena itu web2py tidak akan mengetahui perubahan apa pun yang dibuat.

Dalam hal ini, perlu untuk mengatur fake_migrate = True yang akan membantu untuk mendefinisikan kembali metadata sedemikian rupa sehingga setiap perubahan seperti mengubah atau menghapus akan disimpan di bawah pengetahuan web2py.

SQLite tidak mendukung jenis Boolean. Untuk ini, web2py secara internal memetakan Boolean ke 1 string karakter, dengan 'T' dan 'F' mewakilitrue dan False masing-masing.

MySQL

MySQL tidak mendukung fitur ALTER TABLE. Jadi, migrasi database melibatkan banyak komit. Situasi ini dapat dihindari dengan mengatur parameterfake_migrate = True saat mendefinisikan database, yang akan menyimpan semua metadata.

Peramal

Oracle tidak mendukung fitur pagination of records. Itu juga tidak memiliki dukungan untuk kata kunci OFFSET atau batas. Untuk ini, web2py mencapai pagination dengan bantuan pemilihan bersarang tiga arah yang kompleks dari DAL. DAL perlu menangani pagination sendiri, jika database Oracle telah digunakan.