<style>
.text-center{
text-align: center; //文字置中
}
.text-left{
text-align: left; //文字靠左
}
.text-right{
text-align: right; //文字靠右
}
.text-justify{
text-align: justify; //文字分散
}
</style>
# ORM
## Object Relational Mapping
---
# 什麼是 ORM?
----
<p class="text-justify">
中文為物件關聯對映。
ORM 在網站開發結構中,是在『資料庫』和『 Model 資料容器 』兩者之間,
簡單來說,它是一個幫助使用者更簡便、安全的去從資料庫讀取資料,
因為 ORM 的一個特性為: 透過程式語言(Ruby, Java),去操作資料庫語言( SQL )。
</p>
---
## 使用 ORM 的好處與壞處
----
## 好處
1. 安全性
終於不會再被 SQL Injection 啦~
~~但隨之而來的是 ORM Injection~~
2. 簡單舒適好維護
脫離 SQL 語法,每天舒適好開心。
3. 通用性
一套通吃全部,~~只要驅動有包好~~。
----
## ORM Injection
```ruby!
Orders.find_all "customer_id = '#{@params['order_date']}'"
```
塞入 ```OR 1--``` ~~就可以開心注入了~~
----
## 通用性
#### ORM
```js!
Tests = Test.findAll(limit: 10, where: {id: 12});
```
#### SQL
```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若無實作則會無法使用。
----
### 複雜查詢
```ruby!
User.where("age between ? and ?", 10, 30)
```
----
### 專屬語法
<p class="text-justify">
尤其日期處理部分,各家資料庫實作方式皆不相同。
</p>
```sql!
--- 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 來玩
```shell!
mkdir python-orm
cd python-orm
pipenv install orator
pipenv install PyMySQL
```
----
### 建立本地資料庫
使用之前學過的 ```docker-compose```
將此檔案命名成 ```docker-compose.yml```
```yaml!
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
```
----
### 終端機打上
```shell!
docker-compose up -d
```
----
----
### 打上以下簡短的程式碼
嘗試連線看看
```python!
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)
```
----
----
{"metaMigratedAt":"2023-06-17T22:28:34.567Z","metaMigratedFrom":"YAML","title":"ORM","breaks":true,"contributors":"[{\"id\":\"63474674-1754-4936-9d31-80e84232b8c1\",\"add\":2857,\"del\":111}]"}