<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}]"}
    74 views