iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
Odoo

30天就算 0 基礎,也能使用 GenAI 創造簡單的 Odoo 模組應用系列 第 14

【Day14】運用 Odoo ORM 在資料庫建立,簡易電商顧客訂單模型

  • 分享至 

  • xImage
  •  

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 ORM vs Database DDL
  • Odoo 17 ORM API 實作:電商顧客和訂單的表格
    • 客戶表 (Customers) 的模型
    • 訂單表 (Orders) 的模型
    • 看不太懂嘛!? 可以再複習前面的文章
  • SQL DDL vs Odoo ORM 比較表
    • 名詞與結構對應解釋
  • 小結
  • 引用

Odoo ORM vs Database DDL

  1. 抽象層次

    • Odoo ORM(Object-Relational Mapping)提供了一個高階的抽象層,讓開發者可以使用 Python 來定義模型、欄位和關聯,無需直接編寫 SQL 語法。
    • Database DDL(Data Definition Language)是用來操作資料庫結構的語言,包括建立、修改、刪除表格等。這是 Odoo ORM 背後運行的實際 SQL 操作。
  2. 自動化

    • 當使用 Odoo ORM 定義模型時,Odoo 自動將這些 Python 模型轉換為 DDL 語法,並執行相應的 SQL 操作來建立或修改資料庫中的表格和欄位。這樣,開發者不需要直接處理底層的 SQL。
  3. 同步資料庫結構

    • Odoo 的 ORM 會根據模型的變更自動生成 SQL 語句,通過系統內建的升級工具(如 odoo-bin -u)來同步資料庫結構,確保資料庫中的表格、欄位和關聯與模型保持一致。
  4. 可維護性和靈活性

    • 使用 ORM 可以更直觀地管理資料庫結構,尤其在多變的應用場景下,ORM 可以隨時根據需求修改 Python 模型,然後自動同步到資料庫,而不用手動撰寫或管理 DDL。

Odoo 17 ORM API 實作:電商顧客和訂單的表格

在 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)
);

客戶表 (Customers) 的模型

在 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')  # 電話

訂單表 (Orders) 的模型

將客戶 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 表

看不太懂嘛!? 可以再複習前面的文章

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'

名詞與結構對應解釋

  1. 表 (Table) vs 模型 (Model)

    • SQL 中的 CREATE TABLE 用來創建表格,Odoo 中使用 _name 定義資料庫中的表格名稱。
  2. 欄位 (Column) vs 欄位 (Field)

    • SQL 中使用 INT, VARCHAR 等資料型別來定義表格的欄位,Odoo 則用 fields.Integer(), fields.Char() 等來對應資料型別。
  3. 主鍵 (Primary Key)

    • SQL 中主鍵需要明確定義,Odoo 的 ORM 會自動為每個模型生成一個名為 id 的唯一主鍵,因此不需要手動指定主鍵,但可以使用 unique 來確保欄位值的唯一性。
  4. 外鍵 (Foreign Key) vs Many2one

    • 在 SQL 中,用 FOREIGN KEY 明確定義外鍵並建立與其他表的關聯。Odoo 中則使用 fields.Many2one 來實現這一點,該欄位會連接到其他模型。
  5. 資料型別 (Data Type)

    • SQL 的資料型別如 INT, VARCHAR, DATE 對應到 Odoo 中的 fields.Integer(), fields.Char(), fields.Date() 等。
  6. 唯一性約束 (Unique Constraint)

    • SQL 中可以使用 UNIQUE 來保證某個欄位的唯一性。在 Odoo 中,可以透過 _sql_constraints 定義約束。
  7. 刪除規則 (On Delete Cascade)

    • 在 SQL 中,ON DELETE CASCADE 用於確定外鍵行為。在 Odoo 中,這可以通過 ondelete='cascade' 來實現,當外鍵關聯的記錄被刪除時,相關記錄也會被自動刪除。

小結

  • SQL DDL 需要手動編寫每一個細節,包括主鍵、外鍵、索引、資料型別等,並且通常操作較為底層。
  • Odoo ORM API 則透過模型來抽象化了這些操作,允許開發者使用 Python 語法來定義表格,並將常見的資料庫操作(如關聯、唯一性約束、刪除規則)簡化為高級欄位屬性。這種方式更適合開發應用程式時整合資料庫操作,提升開發效率。

引用 Reference


上一篇
【Day13】零基礎開始 ERP 關聯式資料庫 (Relational Database):從創建表格結構開始 (DDL)
下一篇
【Day15】零基礎 ERP 關聯式資料庫 (Relational Database):操作表格資料 (DML)
系列文
30天就算 0 基礎,也能使用 GenAI 創造簡單的 Odoo 模組應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言