Web2py - Lớp trừu tượng cơ sở dữ liệu
Các Database Abstraction Layer (DAL)được coi là thế mạnh chính của web2py. DAL cho thấy Giao diện lập trình ứng dụng (API) đơn giản với cú pháp SQL cơ bản.
Trong chương này, chúng ta sẽ làm quen với các ứng dụng không hề nhỏ của DAL, chẳng hạn như xây dựng các truy vấn để tìm kiếm theo thẻ một cách hiệu quả và xây dựng cây danh mục phân cấp.
Một số tính năng quan trọng của DAL là -
web2py bao gồm Lớp trừu tượng cơ sở dữ liệu (DAL), một API ánh xạ các đối tượng Python thành các đối tượng cơ sở dữ liệu. Các đối tượng cơ sở dữ liệu có thể là truy vấn, bảng và bản ghi.
DAL tự động tạo SQL trong thời gian thực bằng cách sử dụng phương ngữ được chỉ định cho phần cuối cơ sở dữ liệu, do đó, nhà phát triển không bắt buộc phải viết truy vấn SQL hoàn chỉnh.
Ưu điểm chính của việc sử dụng DAL là các ứng dụng sẽ có thể di động với các loại cơ sở dữ liệu khác nhau.
Bắt đầu với DAL
Hầu hết các ứng dụng trong web2py yêu cầu kết nối cơ sở dữ liệu. Do đó, xây dựng mô hình cơ sở dữ liệu là bước đầu tiên trong quá trình thiết kế một ứng dụng.
Xem xét ứng dụng mới tạo có tên “helloWorld”. Cơ sở dữ liệu được thực hiện theo Mô hình của ứng dụng. Tất cả các mô hình cho ứng dụng tương ứng được bao gồm trong tệp có tên -models/db_custom.py.
Các bước sau được sử dụng để triển khai DAL:
Bước 1 - Khối mã lệnh DAL
Thiết lập kết nối cơ sở dữ liệu. Điều này được tạo bằng cách sử dụng đối tượng DAL mà còn được gọi là phương thức khởi tạo DAL.
db = DAL ('sqlite://storage.sqlite')
Đặc điểm đáng chú ý của DAL là nó cho phép nhiều kết nối với cùng một cơ sở dữ liệu hoặc với các cơ sở dữ liệu khác nhau, thậm chí với các loại cơ sở dữ liệu khác nhau. Theo quan sát, dòng này đã có trong tệpmodels/db.py. Do đó, bạn có thể không cần nó, trừ khi bạn đã xóa nó hoặc cần kết nối với một cơ sở dữ liệu khác. Theo mặc định, web2py kết nối với cơ sở dữ liệu SQLite được lưu trữ trong tệpstorage.sqlite.
Tệp này nằm trong thư mục cơ sở dữ liệu của ứng dụng. Nếu tệp không có, nó được tạo bởi web2py khi ứng dụng được thực thi lần đầu tiên.
SQLite nhanh và lưu trữ tất cả dữ liệu trong một tệp duy nhất. Điều này có nghĩa là dữ liệu của bạn có thể dễ dàng chuyển từ ứng dụng này sang ứng dụng khác. Trên thực tế, (các) cơ sở dữ liệu SQLite được web2py đóng gói cùng với các ứng dụng. Nó cung cấp hỗ trợ SQL đầy đủ, bao gồm bản dịch, phép nối và tổng hợp.
Có hai nhược điểm của SQLite.
Một là nó không bắt buộc các loại cột, và không có BẢNG ĐIỀU KHIỂN ngoại trừ việc thêm và bớt cột.
Điểm bất lợi khác là toàn bộ cơ sở dữ liệu bị khóa bởi bất kỳ giao dịch nào yêu cầu quyền ghi.
Bước 2 - Trình tạo bảng
Khi kết nối với cơ sở dữ liệu được thiết lập, chúng tôi có thể sử dụng define_table phương pháp xác định bảng mới.
Ví dụ -
db.define_table('invoice',Field('name'))
Phương thức trên cũng được sử dụng giữa các phương thức khởi tạo Bảng. Cú pháp cho hàm tạo bảng giống nhau. Đối số đầu tiên là tên bảng và theo sau là danh sáchField(s). Hàm tạo trường nhận các đối số sau:
Sr.No | Lập luận & Cách sử dụng |
---|---|
1 | The field name Tên của trường trong bảng. |
2 | The field type nhận các giá trị có bất kỳ kiểu dữ liệu nào như chuỗi (mặc định), văn bản, boolean, số nguyên, v.v. |
3 | Length Xác định độ dài tối đa. |
4 | default = None Đây là giá trị mặc định khi một bản ghi mới được chèn vào. |
5 | update = None Điều này hoạt động giống như mặc định, nhưng giá trị chỉ được sử dụng khi cập nhật, không phải khi chèn. |
6 | Notnull Điều này chỉ định liệu giá trị trường có thể là NULL hay không. |
7 | readable = True Điều này chỉ định liệu trường có thể đọc được trong các biểu mẫu hay không. |
số 8 | writable = True Điều này chỉ định trường có thể ghi trong các biểu mẫu hay không. |
9 | label = "Field Name" Đây là nhãn được sử dụng cho trường này trong các biểu mẫu. |
Các define_table phương thức cũng nhận ba đối số được đặt tên -
Cú pháp
db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
migrate = True - Điều này hướng dẫn web2py tạo bảng nếu nó không tồn tại hoặc thay đổi nó nếu nó không phù hợp với định nghĩa mô hình.
fake_migrate = False - Nếu mô hình khớp với nội dung bảng cơ sở dữ liệu, thì hãy đặt fake_migrate = True để giúp web2py xây dựng lại dữ liệu.
format = '%(id)s' - Đây là một chuỗi định dạng xác định cách biểu diễn các bản ghi trên bảng đã cho.
Tạo SQL thô
Sử dụng DAL, chúng ta có thể thiết lập kết nối với cơ sở dữ liệu và tạo các bảng mới và các trường của chúng bằng cách sử dụng hàm tạo bảng và hàm tạo trường.
Đôi khi, cần tạo các câu lệnh SQL để phù hợp với đầu ra cần thiết. web2py bao gồm các chức năng khác nhau, giúp tạo SQL thô, được cung cấp như sau:
_chèn
Nó giúp tìm nạp các câu lệnh chèn cho bảng nhất định. Ví dụ,
print db.person._insert(name ='ABC')
Nó sẽ truy xuất câu lệnh chèn cho bảng có tên “person”.
Đầu ra câu lệnh SQL -
INSERT INTO person(name) VALUES ('ABC');
_đếm
Nó giúp tìm nạp câu lệnh SQL, cung cấp số lượng bản ghi. Ví dụ, hãy xem xét một bảng có tên 'người' và chúng ta cần tìm số người có tên 'ABC'.
print db(db.person.name ==' ABC ')._count()
Đầu ra câu lệnh SQL -
SELECT count(*) FROM person WHERE person.name = ' ABC ';
_lựa chọn
Nó giúp tìm nạp các câu lệnh SQL chọn lọc. Ví dụ, hãy xem xét một bảng có tên 'người' và chúng ta cần tìm danh sách những người có tên 'ABC'.
print db(db.person.name == ' ABC ')._select()
Đầu ra câu lệnh SQL -
SELECT person.name FROM person WHERE person.name = ' ABC ';
_xóa bỏ
Nó giúp tìm nạp delete SQLcác câu lệnh. Ví dụ: hãy xem xét bảng có tên 'người' và chúng ta cần xóa các câu lệnh có tên 'ABC'
print db(db.person.name == ' ABC ')._delete()
Đầu ra câu lệnh SQL -
DELETE FROM person WHERE person.name = ' ABC ';4
_cập nhật
Nó giúp tìm nạp các câu lệnh SQL được cập nhật. Ví dụ: hãy xem xét bảng có tên 'người' và chúng ta cần cập nhật tên cột với một số giá trị khác.
print db(db.person.name == ' ABC ')._update()
Đầu ra câu lệnh SQL -
UPDATE person SET WHERE person.name = ’Alex’;
Vấn đề với DAL (Gotchas)
SQLite
SQLite thiếu hỗ trợ loại bỏ hoặc thay đổi các cột. Việc xóa một trường khỏi bảng sẽ giữ cho trường đó hoạt động trong cơ sở dữ liệu, do đó web2py sẽ không biết về bất kỳ thay đổi nào được thực hiện.
Trong trường hợp này, cần phải đặt fake_migrate = True điều này sẽ giúp xác định lại siêu dữ liệu để bất kỳ thay đổi nào như thay đổi hoặc xóa sẽ được lưu giữ dưới sự hiểu biết của web2py.
SQLite không hỗ trợ kiểu Boolean. Đối với điều này, web2py ánh xạ nội bộ các Boolean thành 1 chuỗi ký tự, với 'T' và 'F' đại diệntrue và False tương ứng.
MySQL
MySQL không hỗ trợ tính năng ALTER TABLE. Do đó, việc di chuyển cơ sở dữ liệu liên quan đến nhiều cam kết. Tình huống này có thể tránh được bằng cách cài đặt tham sốfake_migrate = True trong khi xác định cơ sở dữ liệu, cơ sở dữ liệu này sẽ giữ nguyên tất cả siêu dữ liệu.
Oracle
Oracle không hỗ trợ tính năng phân trang các bản ghi. Nó cũng thiếu hỗ trợ cho các từ khóa OFFSET hoặc giới hạn. Đối với điều này, web2py đạt được phân trang với sự trợ giúp của một lựa chọn phức tạp được lồng ghép ba chiều của DAL. DAL cần tự xử lý phân trang, nếu cơ sở dữ liệu Oracle đã được sử dụng.