Odoo ORM 將資料庫的 DDL 操作抽象化為高階的 Python 語法,簡化了開發者對資料庫操作的負擔,同時仍然利用底層的 DDL 來實現資料庫的實際操作。接下來我們會簡述 Odoo ORM 和 DDL 實作比較,先將精華放在前面,後面會來解說這個例子。
SQL DDL vs Odoo ORM 比較表
概念/功能 | SQL DDL | Odoo ORM API |
---|---|---|
表 (Table) | CREATE TABLE Customers |
_name = 'my_module.customers' |
欄位 (Column) | CustomerID INT PRIMARY KEY |
customer_id = fields.Integer(...) |
Name VARCHAR(255) |
name = fields.Char(...) |
|
Address VARCHAR(255) |
address = fields.Char(...) |
|
Phone VARCHAR(15) |
phone = fields.Char(...) |
|
主鍵 (Primary Key) | PRIMARY KEY (CustomerID) |
自動處理:在模型中不需要明確定義 |
外鍵 (Foreign Key) | FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) |
customer_id = fields.Many2one('my_module.customers', ...) |
資料型別 (Data Type) | INT , VARCHAR(255) , DATE |
fields.Integer() , fields.Char() , fields.Date() |
資料表描述 (Description) | 不常用,通常不明確定義表格描述 | _description = 'Customers Table' |
抽象層次:
自動化:
同步資料庫結構:
odoo-bin -u
)來同步資料庫結構,確保資料庫中的表格、欄位和關聯與模型保持一致。可維護性和靈活性:
在 Odoo 17 中,ORM API 是用來定義和操作資料庫模型的工具,類似於 SQL 但以 Python 程式碼的形式實現。你可以使用 Odoo 的 models.Model 來建立模型,並透過欄位來定義表格結構。以下是如何將你提供的 SQL 語句改寫為 Odoo 17 的 ORM 模型。
回顧一下的 Day13 的例子
【Day13】零基礎開始 ERP 關聯式資料庫 (Relational Database):從創建表格結構開始
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
Name VARCHAR(255),
Address VARCHAR(255),
Phone VARCHAR(15)
);
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE,
CustomerID INT,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
在 Odoo 中,模型對應於資料庫中的表格,使用 models.Model 繼承來建立模型。你可以使用 Odoo 的欄位類型來定義每個資料庫欄位。
from odoo import models, fields
# 定義 Customers 模型
class Customers(models.Model):
_name = 'my_module.customers' # 資料庫表名稱
_description = 'Customers Table'
customer_id = fields.Integer(string='Customer ID', required=True, index=True) # 主鍵
name = fields.Char(string='Name', required=True) # 客戶名稱
address = fields.Char(string='Address') # 客戶地址
phone = fields.Char(string='Phone') # 電話
將客戶 ID 作為外鍵來建立兩者之間的關聯,這樣可以讓每個訂單都關聯到特定客戶。
from odoo import models, fields
# 定義 Orders 模型
class Orders(models.Model):
_name = 'my_module.orders' # 資料庫表名稱
_description = 'Orders Table'
order_id = fields.Integer(string='Order ID', required=True, index=True) # 主鍵
order_date = fields.Date(string='Order Date') # 訂單日期
customer_id = fields.Many2one('my_module.customers', string='Customer', ondelete='cascade') # 外鍵,關聯到 Customers 表
fields.Integer(...):資料型態 int, float ...
【Day02】什麼是『寫程式』? 什麼最重要呢? 這些如何影響到下指令給 GenAI
name = 'my_module.orders':變數操作
【Day03】寫程式解決問題有很多步驟,那上個步驟的結果如何傳遞給下個步驟呢?
class Orders(models.Model):Class 和 繼承
【Day09】 物件導向構建電商系統:Class、繼承與封裝的應用
from odoo import models, fields:引用 Odoo 的模組 (函式庫)
【Day10】模組 (Module) 化設計及使用:稅務計算功能為例
fields.Integer(string='Customer ID', required=True, index=True):關鍵字參數 (Keyword Arguments)
【Day08】函數設計 (function):自動化報表輸出和客戶資料管理
概念/功能 | SQL DDL | Odoo ORM API |
---|---|---|
表 (Table) | CREATE TABLE Customers |
_name = 'my_module.customers' |
欄位 (Column) | CustomerID INT PRIMARY KEY |
customer_id = fields.Integer(...) |
Name VARCHAR(255) |
name = fields.Char(...) |
|
Address VARCHAR(255) |
address = fields.Char(...) |
|
Phone VARCHAR(15) |
phone = fields.Char(...) |
|
主鍵 (Primary Key) | PRIMARY KEY (CustomerID) |
自動處理:在模型中不需要明確定義 |
外鍵 (Foreign Key) | FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) |
customer_id = fields.Many2one('my_module.customers', ...) |
資料型別 (Data Type) | INT , VARCHAR(255) , DATE |
fields.Integer() , fields.Char() , fields.Date() |
資料表描述 (Description) | 不常用,通常不明確定義表格描述 | _description = 'Customers Table' |
表 (Table) vs 模型 (Model):
CREATE TABLE
用來創建表格,Odoo 中使用 _name
定義資料庫中的表格名稱。欄位 (Column) vs 欄位 (Field):
INT
, VARCHAR
等資料型別來定義表格的欄位,Odoo 則用 fields.Integer()
, fields.Char()
等來對應資料型別。主鍵 (Primary Key):
id
的唯一主鍵,因此不需要手動指定主鍵,但可以使用 unique
來確保欄位值的唯一性。外鍵 (Foreign Key) vs Many2one:
FOREIGN KEY
明確定義外鍵並建立與其他表的關聯。Odoo 中則使用 fields.Many2one
來實現這一點,該欄位會連接到其他模型。資料型別 (Data Type):
INT
, VARCHAR
, DATE
對應到 Odoo 中的 fields.Integer()
, fields.Char()
, fields.Date()
等。唯一性約束 (Unique Constraint):
UNIQUE
來保證某個欄位的唯一性。在 Odoo 中,可以透過 _sql_constraints
定義約束。刪除規則 (On Delete Cascade):
ON DELETE CASCADE
用於確定外鍵行為。在 Odoo 中,這可以通過 ondelete='cascade'
來實現,當外鍵關聯的記錄被刪除時,相關記錄也會被自動刪除。