Web2py - 資料庫抽象層



資料庫抽象層 (DAL) 被認為是 web2py 的主要優勢。DAL 為底層的 SQL 語法提供了一個簡單的應用程式程式設計介面 (API)。

在本章中,我們將瞭解 DAL 的一些非平凡應用,例如構建查詢以有效地按標籤搜尋以及構建分層類別樹。

DAL 的一些重要特性包括:

  • web2py 包含一個數據庫抽象層 (DAL),這是一個將 Python 物件對映到資料庫物件的 API。資料庫物件可以是查詢、表和記錄。

  • DAL 使用指定的資料庫後端方言動態生成即時 SQL,因此開發人員不必編寫完整的 SQL 查詢。

  • 使用 DAL 的主要優點是應用程式可以與不同型別的資料庫移植。

DAL 入門

大多數 web2py 應用程式都需要資料庫連線。因此,構建資料庫模型是應用程式設計的首要步驟。

考慮一個新建立的名為 “helloWorld” 的應用程式。資料庫在應用程式的 Models 下實現。所有相應應用程式的模型都包含在一個名為 models/db_custom.py 的檔案中。

實現 DAL 使用以下步驟:

步驟 1 - DAL 建構函式

建立資料庫連線。這是使用 DAL 物件建立的,也稱為 DAL 建構函式。

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

DAL 的一個顯著特點是它允許與同一個資料庫或不同的資料庫(甚至不同型別的資料庫)進行多個連線。可以觀察到,此行已存在於 models/db.py 檔案中。因此,除非您刪除了它或需要連線到不同的資料庫,否則您可能不需要它。預設情況下,web2py 連線到儲存在 storage.sqlite 檔案中的 SQLite 資料庫。

此檔案位於應用程式的 databases 資料夾中。如果該檔案不存在,則在第一次執行應用程式時由 web2py 建立。

SQLite 速度很快,並將所有資料儲存在一個檔案中。這意味著您的資料可以很容易地從一個應用程式傳輸到另一個應用程式。事實上,SQLite 資料庫由 web2py 與應用程式一起打包。它提供完整的 SQL 支援,包括翻譯、聯接和聚合。

SQLite 有兩個缺點。

  • 一個是它不強制執行列型別,並且除了新增和刪除列之外,沒有 ALTER TABLE。

  • 另一個缺點是任何需要寫入訪問許可權的事務都會鎖定整個資料庫。

步驟 2 - 表建構函式

一旦建立了與資料庫的連線,我們就可以使用 define_table 方法來定義新表。

例如:

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

上述方法也用於表建構函式中。表建構函式的語法相同。第一個引數是表名,後面跟著一個 Field(s) 列表。欄位建構函式採用以下引數:

序號 引數和用法
1

欄位名稱

表中欄位的名稱。

2

欄位型別

採用任何資料型別的值,例如字串(預設)、文字、布林值、整數等等。

3

長度

定義最大長度。

4

default = None

這是插入新記錄時的預設值。

5

update = None

這與 default 的作用相同,但該值僅在更新時使用,而不是在插入時使用。

6

Notnull

這指定欄位值是否可以為 NULL。

7

readable = True

這指定欄位在表單中是否可讀。

8

writable = True

這指定欄位在表單中是否可寫。

9

label = "Field Name"

這是要在表單中為此欄位使用的標籤。

define_table 方法還採用三個命名引數:

語法

db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
  • migrate = True - 這指示 web2py 在表不存在時建立表,或者在表與模型定義不匹配時更改表。

  • fake_migrate = False - 如果模型與資料庫表內容匹配,則設定 fake_migrate = True,這有助於 web2py 重新構建資料。

  • format = '%(id)s' - 這是一個格式字串,它確定如何表示給定表上的記錄。

生成原始 SQL

使用 DAL,我們可以建立到資料庫的連線,並使用表建構函式和欄位建構函式建立新表及其欄位。

有時,需要生成 SQL 語句以符合必要的輸出。web2py 包含各種函式,有助於生成原始 SQL,如下所示:

_insert

它有助於獲取給定表的插入語句。例如:

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

它將檢索名為“person”表的插入語句。

SQL 語句輸出:

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

_count

它有助於獲取 SQL 語句,該語句給出記錄的數量。例如,考慮一個名為“person”的表,我們需要查詢名為“ABC”的人員數量。

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

SQL 語句輸出:

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

_select

它有助於獲取 select SQL 語句。例如,考慮一個名為“person”的表,我們需要查詢名為“ABC”的人員列表。

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

SQL 語句輸出:

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

_delete

它有助於獲取delete SQL 語句。例如,考慮名為“person”的表,我們需要刪除名為“ABC”的語句。

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

SQL 語句輸出:

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

_update

它有助於獲取更新的 SQL 語句。例如,考慮名為“person”的表,我們需要使用其他值更新列名。

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

SQL 語句輸出:

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

DAL 的問題(陷阱)

SQLite

SQLite 缺乏刪除或更改列的支援。從表中刪除欄位會使其在資料庫中保持活動狀態,因此 web2py 將不知道所做的任何更改。

在這種情況下,需要設定fake_migrate = True,這將有助於重新定義元資料,以便任何更改(例如更改或刪除)都將被 web2py 瞭解。

SQLite 不支援布林型別。為此,web2py 在內部將布林值對映到 1 個字元的字串,其中 'T' 和 'F' 分別代表trueFalse

MySQL

MySQL 不支援 ALTER TABLE 功能。因此,資料庫遷移涉及多個提交。可以透過在定義資料庫時設定引數fake_migrate = True 來避免這種情況,這將保留所有元資料。

Oracle

Oracle 不支援記錄分頁功能。它也不支援 OFFSET 或 limit 關鍵字。為此,web2py 在 DAL 的複雜三向巢狀選擇幫助下實現分頁。如果使用了 Oracle 資料庫,則 DAL 需要自行處理分頁。

廣告
© . All rights reserved.