使用對象關係映射(Object-Relational Mapper, ORM)框架,它將低層的數據庫操做指令抽象成高層的面向對象操做。也就是說,若是咱們直接使用數據庫引擎,咱們就要寫 SQL 操做語句,可是,若是咱們使用了 ORM 框架,咱們對諸如表、文檔此類的數據庫實體就能夠簡化成對 Python 對象的操做python
SQLAlchemy已經成爲了python世界裏面orm的標準,flask是一個輕巧的web框架,能夠自由的使用orm,其中flask-sqlalchemy是專門爲flask指定的插件。mysql
在 Flask-SQLAlchemy 中,數據庫使用 URL 指定。web
MySQL --> mysql://username:password@hostname/database
安裝sql
pip install flask-sqlalchemy
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) db = SQLAlchemy(app) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:sheen@localhost/zaj_sql' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) email = db.Column(db.String(120), unique=True)
爲了建立初始數據庫,調用 SQLAlchemy.create_all() 方法來建立表和數據庫:數據庫
db.create_all()
您的數據庫已經生成。如今來建立一些用戶flask
admin = User('admin', 'admin@example.com') guest = User('guest', 'guest@example.com')
可是它們尚未真正地寫入到數據庫中,所以讓咱們來確保它們已經寫入到數據庫中bootstrap
db.session.add(admin) db.session.add(guest) db.session.commit()
SQLAlchemy 鏈接到關係型數據庫,關係型數據最擅長的東西就是關係。所以,咱們將建立一個使用兩張相互關聯的表的應用做爲例子。
最爲常見的關係就是一對多的關係。由於關係在它們創建以前就已經聲明,您能夠使用 字符串來指代尚未建立的類
關係使用 relationship() 函數表示。然而外鍵必須用類 sqlalchemy.schema.ForeignKey 來單獨聲明.session
from datetime import datetime from flask_bootstrap import Bootstrap from flask_wtf import FlaskForm from flask_sqlalchemy import SQLAlchemy from flask import Flask import pymysql from sqlalchemy import desc app = Flask(__name__) db = SQLAlchemy(app) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:sheen@localhost/zaj_sql' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True bootstrap = Bootstrap(app) class User(db.Model): id = db.Column(db.Integer,autoincrement=True,primary_key=True) name = db.Column(db.String(50),unique=True) passwd = db.Column(db.String(100)) add_time = db.Column(db.DATETIME,default=datetime.now()) gender = db.Column(db.BOOLEAN,default=True) role_id = db.Column(db.INTEGER,db.ForeignKey('role.id')) def __repr__(self): return '<User:%s>' %(self.name) class Role(db.Model): id = db.Column(db.INTEGER,autoincrement=True,primary_key=True) name = db.Column(db.String(50),unique=True) users = db.relationship('User',backref='role') # 給Role模型添加users屬性 # backref 是定義反向引用 def __repr__(self): return '<Role:%s>' % (self.name) if __name__ =='__main__': # 1. 建立數據庫表 # db.drop_all() # db.create_all() # # 2. 建立role數據庫表數據 role_1 = Role(name='超級會員') role_2 = Role(name='普通會員') db.session.add(role_1) db.session.add(role_2) db.session.commit() # # # 3. 添加user表內數據,100個用戶,50個爲超級會員,50個爲普通會員 for i in range(1,13): if i%2 == 0: u = User(name='sheen'+str(i),passwd='sheen',role_id=1) db.session.add(u) else: u = User(name='star'+str(i),passwd='star',role_id=2) db.session.add(u) db.session.commit()
backref 是定義反向引用,能夠經過User.role訪問Role對象和屬性。
查詢全部數據app
print('角色',Role.query.all()) print('用戶',User.query.all())
根據條件查詢數據框架
# select * from tablename where xxx=xxxxx print(User.query.filter_by(role_id=1).all()) print(Role.query.filter_by().all()) print(User.query.filter_by(role_id=2).all())
對於找到的數據進行更新
print('進行數據更新',end='\n') u =User.query.filter_by(name='sheen2').first() print(u) u.passwd = '123' db.session.add(u) db.session.commit()
篩選數據方法2(filter),這種方法能夠看見原生的sql語句
print('數據篩選', end='\n') user = User.query.filter(User.role_id==1) print(user)
對於查詢的信息進行顯示限制
print('限制查詢數據的顯示', end='\n') users = User.query.filter_by(role_id=1).limit(3).all() print(users)
對於查詢的信息進行排序輸出(默認狀況由小到大進行排序), 若是想要由大到小: desc(User.add_time)
print('數據再處理', end='\n') users = User.query.filter_by(role_id=1).order_by(desc(User.name)).all() print(users)
多個過濾函數
print('多個過濾函數', end='\n') users = User.query.filter_by(role_id=1).order_by(desc(User.name)).limit(3).offset(1).all() print(users) users = User.query.filter_by(role_id=1).order_by(desc(User.name)).slice(1,4).all() print(users)
分頁,第一個參數表示顯示第幾頁數據,第二個參數表示每頁顯示多少條數據
print('分頁顯示', end='\n') users = User.query.paginate(1,5) print(users.items) users = User.query.paginate(2, 5) print(users.items)