上一講,我們學習了 flask 攔截器與session的使用 ,已經清楚了後臺用戶是否登錄的判斷及驗證 url 合法性的方法 。
本文我們講解數據庫的增刪改查操作 , 每一個應用系統都離不開數據的交互 , 數據庫的操作是必須掌握的技能 。flask 中使用 flask-sqlalchemy 操作數據庫將非常容易 ,我們一起學習一下 。
flask-sqlalchemy 是什麼?他有什麼特點 ?
flask-sqlalchemy 是一套 flask 的數據庫操作框架 。
他的特點是:能夠快速的完成數據庫的增刪改查操作 , 同時還具有的分頁查詢的功能 ,我們不需要寫具體數據庫 sql 語句就可完成不同的數據庫操作 。
如何一步一步完成數據庫增刪改查操作呢 ?
1、 創建數據庫配置文件,在app.py 同級目錄下創建 config.py , 通常我們將數據庫的配置寫到單獨的文件 , 方便數據庫配置的修改 。這裏我們使用的是 mysql ,每一行配置的作用,我均註釋在代碼後面,配置如下:
# encoding: utf-8
# dialect+driver://username:password@host:port/database
DIALECT = 'mysql' # 要用是什麼數據庫,我使用的是 mysql
DRIVER = 'pymysql' # 連接數據庫驅動,pymysql 是 mysql 的驅動
USERNAME = 'root' # 用戶名 ,你的數據庫用戶名
PASSWORD = 'Wjie2018' # 密碼 ,你的數據庫密碼
HOST = '127.0.0.1' # 服務器 ,數據庫所在服務器的ip,本地即 127.0.0.1
PORT = '3306' # 端口 ,數據庫的默認端口 3306
DATABASE = 'ideamerry_repair_v3' # 數據庫名 ,你需要鏈接的具體數據庫的名字 ,這裏是報修數據庫的名字
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
DATABASE) # 拼接成數據庫的 URI ,一般不需要修改
SQLALCHEMY_TRACK_MODIFICATIONS = False # 用於追蹤數據庫修改 , 默認爲True ,設置爲 True 會增加內存消耗
2、創建數據庫 db對象:在app.py 同級目錄下創建 exts.py文件。
使用 exts.py 的目的是方便在其他文件中使用 db 對象做數據操作。
import os
from flask_sqlalchemy import SQLAlchemy
# 此時先不傳入app
db = SQLAlchemy()
3、初始化數據庫,我們在啓動程序即:app.py 中引入exts.py 和config.py 然後執行數據庫初始化操作 。
下面兩行代碼作用是:導入兩個文件
import config
from exts import db
下面兩行代碼作用是:初始化數據庫
app.config.from_object(config) # 加載數據庫配置文件
db.init_app(app) # 綁定到我們到應用程序
注意:這兩行代碼比如放在有數據庫操作的藍圖的上面 , 因爲藍圖中要使用數據庫操作,必須先初始化 ,如果將數據庫操作的藍圖放在這兩行的上面,就是數據庫爲初始化不能使用。
藍圖是什麼?我們後面講解。下面這行就是註冊一個藍圖 user ,因 user 中有數據庫操作,所以下面這行這行必須位於 數據庫初始化代碼的下面,切記!
# 註冊user,使用前綴 user 作爲前綴訪問
app.register_blueprint(user, url_prefix='/user')
4、創建數據庫表的model映射 ,以數據庫中 user 表爲例 。創建model.py 文件 , 遵循 MVC 思想,我們將創建models目錄,然後在models目錄下創建 model.py 。
model 中爲了映射數據庫字段 ,首先要引入數據庫 ,從之前我們創建好的exts中引入 db
from exts import db
然後創建用戶模型
# 用戶模型
class User(db.Model):
tableName = 'user'
id = db.Column(db.INTEGER, primary_key=True, autoincrement=True)
userName = db.Column(db.String(30), nullable=False)
userPassword = db.Column(db.String(30), nullable=False)
openid = db.Column(name='openid', nullable=False)
詳細解釋上面代碼:
第一行表示創建 class 的名字是 User ,參數是數據庫model
class User(db.Model):
第二行是數據表的名字,默認情況下 User 類對應數據庫中的 user表 ,即將大寫字母轉換爲小寫字母的表明。
多個大寫字母的 class 類默認會映射數據的表是什麼呢 ? 比如 class 的名字是 RepairServiceSheet ,他默認映射的數據庫表則是數據庫中的 :repair_service_sheet 表。
若不想使用默認的映射呢 ?我們可以覆蓋默認的映射 ,使用 __tablename__來覆蓋即可 ,如:你的 User 類要對應數據庫中的 sys_user 表,則使用一下代碼 :
class User(db.Model):
__tableName__ = 'sys_user'
第三行及以下是具體字段的映射
class 類的 id 映射數據庫表 user 的 id 字段,並且是主鍵自增長 ,primary_key=True, autoincrement=True
id = db.Column(db.INTEGER, primary_key=True, autoincrement=True)
class 類的 userName 映射數據表的 userName 字段 , 名字必須一模一樣,大小寫一致 。
userName = db.Column(db.String(30), nullable=False)
或寫爲下面形式
userName = db.Column(name='userName', nullable=False)
如果你不想在 class User 裏使用 userName 做爲名字 ,則可寫爲下面形式 :
anyUserName = db.Column(name='userName', nullable=False)
5、增刪改查操作,完成了以上配置 ,數據庫操作就非常簡單了 ,下面依次看一下。(可參照源代碼的controllor/user/user.py中的代碼)
增:向用戶表添加一條數據
user = User(userName='admin', userPassword='123456')
db.session.add(user)
db.session.commit()
刪:刪除用戶表中的一條數據
resultUser = User.query.filter(User.id == 1).first()
db.session.delete(resultUser)
db.session.commit()
改:修改用戶表的一條數據 ,先查詢出需要修改的記錄再做修改提交
dbUser = User.query.filter(User.id == 1).first() # 先根據 id 查出數據庫的一條數據
dbUser.userName='study2100' # 修改用戶名admin 爲 study2100
db.session.commit() # 提交數據庫
查:分頁查詢用戶表數據
users = User.query.paginate(1, per_page=10) # 分頁查詢第一頁數據,本頁查詢10條
users = User.query.order_by(User.id.desc()).paginate(page, per_page=10) # order_by 是排序,按照 id 倒敘排列查詢
總結:
flask 中數據庫的操作並不複雜 , 只要我們按照這樣的步驟去做 ,注意細節 ,增刪改查操作就可以很快的完成 ,學會了數據庫基本操作 , 無論是爲小程序端提供 api 接口,還是後臺管理功能就能很順利的完成 。
如你有任何問題 ,請關注我個人公衆號 JeenWang 並回覆信息,我會爲你解答 。祝你們心情愉快,天天進步。