1. 程式人生 > 實用技巧 >Flask中如何使用MySQL資料庫?

Flask中如何使用MySQL資料庫?

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()