Pyhton拓展數據庫

1. ORM

  • ORM即對象-關係映射
  • 主要實現模型對象到關係數據庫數據的映射

1.1 ORM圖解

1.2 優勢

  • 只須要面向對象編程,不須要面向數據庫編寫代碼
    1. 對數據庫的操做都轉化成對類屬性和方法的操做
    2. 不用編寫各類數據庫的SQL語句
  • 實現了數據模型與數據庫的解耦,屏蔽了不一樣數據操做上的差別
    1. 不在關注用的是MySQL、oracle等
    2. 經過簡單的配置就能夠輕鬆更換數據庫,而不須要修改代碼

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
#查詢時會顯示原始SQL語句
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__)

#設置鏈接數據庫的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
#查詢時會顯示原始SQL語句
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')

    #repr()方法顯示一個可讀字符串
    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從數據庫中加載數據
# 查詢roles表id爲1的角色
ro1 = Role.query.get(1)
# 查詢該角色的全部用戶
ro1.us.all()

# 查詢users表id爲3的用戶
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_(須要導包)
相關文章
相關標籤/搜索