1. ORM
- ORM即對象-關係映射
- 主要實現模型對象到關係數據庫數據的映射
1.1 ORM圖解
1.2 優勢
- 只須要面向對象編程,不須要面向數據庫編寫代碼
- 對數據庫的操做都轉化成對類屬性和方法的操做
- 不用編寫各類數據庫的SQL語句
- 實現了數據模型與數據庫的解耦,屏蔽了不一樣數據操做上的差別
- 不在關注用的是MySQL、oracle等
- 經過簡單的配置就能夠輕鬆更換數據庫,而不須要修改代碼
1.3 缺點
- 相比直接使用SQL語句操做數據庫有性能損失
- 根據對象的操做轉換成SQL語句,根據查詢的結果轉化成對象,在映射過程當中有性能損失
2. Flask-SQLAlchemy
- SQLALchemy其實是對數據庫的抽象,讓開發者不用直接和SQL語句打交道,而是經過Python對象來操做數據庫,捨棄了一些性能,換來開發效率提高
- SQLalchemy是一個關係型數據庫框架,它提供了高層的ORM和底層的原生數據庫的操做。flask-sqlalchemy是一個簡化了SQLalchemy操做的flask拓展。
2.1 數據庫鏈接設置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://MySQL用戶名:MySQL密碼@127.0.0.1:3306/數據庫名字'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_ECHO'] = True
複製代碼
2.2 經常使用的SQLAlchemy字段類型
類型名 |
Python中類型 |
說明 |
Integer |
int |
普通整數,通常是32位 |
SmallInteger |
int |
取值範圍小的整數,通常是16位 |
BigInteger |
int或long |
不限制精度的整數 |
Float |
float |
浮點數 |
Numeric |
decimal.Decimal |
普通整數,通常是32位 |
String |
str |
變長字符串 |
Text |
str |
變長字符串,對較長或不限長度的字符串作了優化 |
Unicode |
unicode |
變長Unicode字符串 |
UnicodeText |
unicode |
變長Unicode字符串,對較長或不限長度的字符串作了優化 |
Boolean |
bool |
布爾值 |
Date |
datetime.date |
時間 |
Time |
datetime.datetime |
日期和時間 |
LargeBinary |
str |
二進制文件 |
2.3 經常使用的SQLAlchemy列選項
選項名 |
說明 |
primary_key |
若是爲True,表明表的主鍵 |
unique |
若是爲True,表明這列不容許出現重複的值 |
index |
若是爲True,爲這列建立索引,提升查詢效率 |
nullable |
若是爲True,容許有空值,若是爲False,不容許有空值 |
default |
爲這列定義默認值 |
2.4 經常使用的SQLAlchemy關係選項
選項名 |
說明 |
backref |
在關係的另外一模型中添加反向引用 |
primary join |
明確指定兩個模型之間使用的聯結條件 |
uselist |
若是爲False,不使用列表,而使用標量值 |
order_by |
指定關係中記錄的排序方式 |
secondary |
指定多對多關係中關係表的名字 |
secondary join |
在SQLAlchemy中沒法自行決定時,指定多對多關係中的二級聯結條件 |
3. 數據庫的基本操做
3.1 在視圖函數中定義模型類
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
us = db.relationship('User', backref='role')
def __repr__(self):
return 'Role:%s'% self.name
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, index=True)
email = db.Column(db.String(64),unique=True)
password = db.Column(db.String(64))
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
def __repr__(self):
return 'User:%s'%self.name
if __name__ == '__main__':
app.run(debug=True)
複製代碼
3.2 一對多的關聯
class Role(db.Model):
...
us = db.relationship("user",backref="role", lazy="danamic")
class User(db.Model):
...
role_id = db.Column(db.Integer, db.ForeignKey("roles.id")
複製代碼
- 其中realtionship描述了Role和User的關係,第一個參數爲「1」的一方,能夠直接查「1」後面對應的「多」的一方的信息
- 第二個參數backref聲明能夠經過「多」的一方直接查詢到「1」的一方的信息
- 第三個參數爲懶加載,決定了何時SQLALchemy從數據庫中加載數據
ro1 = Role.query.get(1)
ro1.us.all()
us1 = User.query.get(3)
us1.role
複製代碼
3.3 經常使用的SQLAlchemy查詢過濾器
過濾器 |
說明 |
filter |
把過濾器添加到原查詢上,返回一個新查詢 |
filter_by() |
把等值過濾器添加到原查詢上,返回一個新查詢 |
limit |
使用指定的值限定原查詢返回的結果 |
offset() |
偏移原查詢返回的結果,返回一個新查詢 |
order_by() |
根據指定條件對原查詢結果進行排序,返回一個新查詢 |
group_by() |
根據指定條件對原查詢結果進行分組,返回一個新查詢 |
3.4 經常使用的SQLAlchemy查詢執行器
方法 |
說明 |
all() |
以列表形式返回查詢的全部結果 |
first() |
返回查詢的第一個結果,若是未查到,返回None |
first_or_404() |
返回查詢的第一個結果,若是未查到,返回404 |
get() |
返回指定主鍵對應的行,如不存在,返回None |
get_or_404() |
返回指定主鍵對應的行,如不存在,返回404 |
count() |
返回查詢結果的數量 |
paginate() |
返回一個Paginate對象,它包含指定範圍內的結果 |
3.4 相關命令
- 建立表:db.create_all()
- 刪除表:db.drop_all()
- 插入數據:db.session.add(變量)(須要commit提交才生效)
- 返回查詢到的第一個對象:對象名.query.first()
- 返回查詢到的全部對象:對象名.query.all()
- filter模糊查詢:對象名.query.filter(限制條件).first/all()
- get查找:對象名.query.get()參數爲主鍵,若是主鍵不存在沒有返回內容
- 邏輯非:!=或者not_(須要導包)
- 邏輯與:and_(須要導包)
- 邏輯或:or_(須要導包)