跳至主要内容

ORM

珉萁的Demo

ORM by 珉萁 in github

ORM

Object Relational Mapping


什麼是 ORM?


中文為物件關聯對映。
ORM 在網站開發結構中,是在『資料庫』和『 Model 資料容器 』兩者之間,
簡單來說,它是一個幫助使用者更簡便、安全的去從資料庫讀取資料,
因為 ORM 的一個特性為: 透過程式語言(Ruby, Java),去操作資料庫語言( SQL )。

使用 ORM 的好處與壞處


好處

  1. 安全性 終於不會再被 SQL Injection 啦~ 但隨之而來的是 ORM Injection

  2. 簡單舒適好維護 脫離 SQL 語法,每天舒適好開心。

  3. 通用性 一套通吃全部,只要驅動有包好


ORM Injection

Orders.find_all "customer_id = '#{@params['order_date']}'"

塞入 OR 1-- 就可以開心注入了


通用性

ORM

Tests = Test.findAll(limit: 10, where: {id: 12});

SQL

-- MySQL
SELECT * FROM TestTable WHERE id=12 LIMIT 10

-- MsSQL
SELECT TOP 10 * FROM TestTable WHERE id=12

壞處

  1. 效能殺手 須將 SQL 內容物件化,資料量越大越消耗記憶體。

  2. 複雜查詢較無法套用 多表 join,複雜關連與條件。 EX: 校務系統

  3. 資料庫專屬的特殊語法,ORM若無實作則會無法使用。


複雜查詢

User.where("age between ? and ?", 10, 30)

專屬語法

尤其日期處理部分,各家資料庫實作方式皆不相同。

--- sqlite3
SELECT datetime('now', 'localtime');
SELECT strftime('%s', 'now');

--- MySQL
SELECT DATE('2003-12-31 01:02:03');

ORM 提供哪些功能?


常見有這 4 項

  1. Model
  2. Migration
  3. Seed
  4. Factory

Model

代表資料庫中的一個表格,包含表格中的欄位以及相應的資料型別。


Migration

資料庫遷移,描述了一個資料庫內的資料表的生成歷程。 可以想像成是一個資料庫版本的 git。


Seed

種子資料,可以放一些希望資料庫初始化時能夠一起放進去的資料。 EX: 預設管理員帳號


Factory

資料工廠,可以套用一些規則,幫你產出數數筆按照規則的資料。 這在做測試時非常有用~


來點實作一下


我們拿 python 來玩

mkdir python-orm
cd python-orm
pipenv install orator
pipenv install PyMySQL

建立本地資料庫

使用之前學過的 docker-compose 將此檔案命名成 docker-compose.yml

version: "3.6"
services:
mysql:
image: mysql:latest
environment:
MYSQL_DATABASE: 'ormdb'
MYSQL_USER: 'user'
MYSQL_PASSWORD: 'user1234'
MYSQL_ROOT_PASSWORD: 'root1234'
ports:
- "127.0.0.1:3306:3306"
phpmyadmin:
depends_on:
- mysql
image: phpmyadmin/phpmyadmin:latest
ports:
- "0.0.0.0:8888:80"
environment:
PMA_HOST: mysql

終端機打上

docker-compose up -d


打上以下簡短的程式碼

嘗試連線看看

from orator import DatabaseManager, Model

config = {
'mysql': {
'driver': 'mysql',
'host': '127.0.0.1',
'database': 'ormdb',
'user': 'user',
'password': 'user1234',
'prefix': ''
}
}

db = DatabaseManager(config)
Model.set_connection_resolver(db)