
ORM的魔法
- 手動編寫SQL語句會降低代碼易讀性,還會出現安全問題
- 在部署切換DBMS時會需要不同的Python接口庫,不太容易
使用ORM會幫你處理查詢參數的轉義,避免SQL注入的風險,另外它為不同的DBMS提供統一接口,讓部署切換資料庫變得非常簡單。ORM扮演翻譯的角色,能夠讓Python讀懂SQL語句,讓我們使用Python來操作資料庫
ORM實作的三層映射
- 表--->Python類
- 字段(列)--->類屬性
- 記錄(行)--->類執行個體
使用Python實作的ORM有SQLAlchemy等,直譯就是SQL煉金術
使用Flask-SQLAlchemy管理資料庫
- 安裝 pipenv install flask-sqlalchemy
- 使用
from flask import Flask
from flasksqlalchemy import SQLAlchemy
app = Flask(_name__)
db = SQLAlchemy(app)
連接配接資料庫伺服器
在Flask-SQLAlchemy中通過SQLALCHEMY_DATABASE_URI設定。Postgres:postgresql://scott:[email protected]/mydatabase
MySQL:mysql://username:[email protected]/databasename
Oracle:oracle://username:[email protected]/databasename
SQLite(UNIX):sqlite:absolute/path/to/foo.db
SQLite(記憶體):sqlite:///:memory:
SQLite(Windows):sqlite:absolutepathtofoo.db
# SQLite URI compatible
WIN = sys.platform.startswith('win')
if WIN:
prefix = 'sqlite:///'
else:
prefix = 'sqlite:'
app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', prefix + os.path.join(app.root_path, 'data.db'))
在Flask-SQLAlchemy中預設為SQLite記憶體型資料庫(sqlite:///:memory:),SQLite是基于檔案的DBMS,不需要設定資料庫伺服器,隻需指定絕對路徑,通過app.root_path來定位資料庫。
建立資料庫模型
class User(db.Model): # 表名将會是 user(自動生成,小寫處理)
id = db.Column(db.Integer, primary_key=True) # 主鍵
name = db.Column(db.String(20)) # 名字
模型類的編寫有一些限制:
- 模型類要聲明繼承
。db.Model
- 每一個類屬性(字段)要執行個體化
,傳入的參數為字段的類型,下面的表格列出了常用的字段類。db.Column
- 在
中添加額外的選項(參數)可以對字段進行設定。比如,db.Column()
設定目前字段是否為主鍵。除此之外,常用的選項還有primary_key
(布爾值,是否允許為空值)、nullable
(布爾值,是否設定索引)、index
(布爾值,是否允許重複值)、unique
(設定預設值)等。default
常用的字段類型如下表所示:
-
整型db.Integer
-
字元串,size 為最大長度,比如db.String (size)
db.String(20)
-
長文本db.Text
-
時間日期,Pythondb.DateTime
對象datetime
-
浮點數db.Float
-
布爾值db.Boolean