Flask中如何使用MySQL資料庫?
阿新 • • 發佈:2021-01-10
1.安裝相關模組
pip3 install flask-sqlalchemy
pip3 intall pymysql
2.匯入模組
import pymysql
from flask_sqlalchemy import SQLAlchemy
3.指定資料庫連線
# 語法:app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:passwd@hostname[:port]/dbname?charset=utf8'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:[email protected]:3306/myflask?charset=utf8 '
4.指定資料庫配置,用來自動提交資料庫變動
app.config['SQLALCHEMY_COMMIT_TEARDOWN'] = Ture
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
5.建立資料庫物件
db = SQLAlchemy(app)
6.建立模型類,用來對映資料庫表
class 類名(db.Model):
#宣告表名,如果不指定,則預設表名為小寫類名
__tablename__ = '表名'
#建立欄位函式
欄位名 = db.Column(欄位型別,[引數]...)
...
例:
class Students(db.Model):
'''學生表'''
__tablename__ = 'stu' #預設表名為小寫的類名即students,但可以通過__tablename__屬性來設定
id = db.Column(db.Integer,primary_key=True,nullable=False) #主鍵預設自增,所以不需要再設定auto_increment引數
name = db.Column(db.String(20),nullable=False)
age = db.Column(db.Integer)
isDelete = db.Column(db.Boolean,nullable=False,default=False)
class Subjects(db.Model):
'''學科表'''
id = db.Column(db.Integer,primary_key=True,nullable=False)
title = db.Column(db.String(20),unique=True,nullable=False)
class Scores(db.Model):
'''成績表'''
id = db.Column(db.Integer,primary_key=True,nullable=False)
stu_id = db.Column(db.ForeignKey(Students.id),nullable=False) # 外來鍵
sub_id = db.Column(db.ForeignKey(Subjects.id),nullable=False)
score = db.Column(db.Integer,nullable=False)
6.1模型類中常見欄位型別:
欄位型別 | 說明 |
Integer | 常規整型,通常為32位 |
SmallInteger | 短整型,通常為16位 |
BigInteger | 精度不受限整型 |
Float | 浮點型 |
Numeric | 小數 |
String | 可變長度字串 |
Text | 可變長度字串,適合大量文字 |
Unicode | 可變長度Unicode字串 |
Boolean | 布林型別 |
Date | 日期型別 |
Time | 時間型別 |
DateTime | 日期時間型別 |
Interval | 時間間隔,相當於datetime.timedelta |
Enum | 字元列表 |
PickleType | 自動Pickle序列化 |
LargeBinary | 二進位制 |
6.2 模型類中欄位常見引數:
引數 | 說明 |
autoincrement | 是否自增(True/False) |
primary_key | 是否主鍵 |
index | 是否建立索引 |
unique | 是否唯一 |
nullable | 是否允許為null |
default | 設定預設值 |
db.ForeignKey(模型類名.id) | 建立外來鍵約束 |
7.資料庫增、刪、改、查操作
-
新增:
laowang = Students(name='老王',age=30) laozhang = Students(name='老張',age=35) db.session.add(laowang) db.session.add(laozhang) # db.session.add_all([laowang,laozhang]) 一次性新增包含所有記錄物件的列表 db.session.commit()
-
查詢
- 完整的查詢應該是:
<模型類>.query.<過濾方法>.<查詢方法>
- 查詢過濾器(返回新產生的查詢物件)------可疊加使用
filter():使用指定的規則過濾記錄 filter_by():使用指定的規則過濾記錄(關鍵字表達式的形式) order_by():根據指定條件對記錄進行排序 limit():限制查詢的條數 group_by():根據指定條件對記錄進行分組 off_set():使用指定的值偏移原查詢的結果
- 查詢方法
all(): 返回所有包含查詢記錄的列表 first(): 返回查詢的第一條記錄,未查到則返回None one(): 返回第一條記錄,有且僅有一條記錄,否則報錯 get(id): 返回指定主鍵值的記錄,未查到則返回None count(): 返回查詢結果的數量 one_or_none(): 有且僅有一條記錄,返回記錄,否則返回None first_or_404(): 返回查詢的第一條記錄,未查到則報404錯誤 get_or_404(id): 返回指定主鍵值的記錄,未查到則報404錯誤 paginate(): 返回一個Pagination物件,可以對記錄進行分頁處理 with_parent(類例項): 返回和這個例項相關聯的物件
- 示例
from sqlalchemy import and_,or_,not_
Students.query.all() #查詢所有 包含所有記錄的列表 Students.query.filter_by(name='老張').first()#條件查詢,精確查詢 Students.query.filter(Students.name.endwith('王')).all()# 模糊查詢,返回名字以'王'結尾的所有資料。 Students.query.filter(Students.name!='老王').all()#邏輯非 Students.query.filter(not_(Students.name=='老王')).all()#取反 Students.query.filter(and_(Students.name=='老王',Students.age=20)).all() #邏輯與 Students.query.filter(or_(Students.name=='老王',Students.age==30)).all() #邏輯或 Students.query.order_by(Students.age).all()#排序查詢 Students.query.limit(1).all()#查詢1條 Students.query.get(id = 1)#精確查詢 -
更新
stu = Students.query.first() stu.name = '老李' db.session.commit()
-
刪除
laowang = Students.query.filter_by(name='老王').first() db.session.delete(laowang) db.session.commit()