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:mysql@127.0.0.1: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()
相關文章
相關標籤/搜索