一、配置項目的數據庫(config)
爲簡化數據庫的連接,選擇使用 PyMySQL插件,支持MySQL數據庫,選裝 pip install PyMySQL。
然後創建config文件,可區分不同開發環境的config文件,連接方式如下:
# database
# 是否自動記錄調試記錄
SQLALCHEMY_ECHO = False
# 綁定數據庫 charset=utf8mb4 指定轉碼格式,須與數據庫設置一致
# python 3 綁定前綴需爲 mysql+pymysql ,否則有問題(無效或報錯)
SQLALCHEMY_BINDS = {
'數據庫-代名(自定義,本地使用)' : 'mysql+pymysql://用戶名:密碼@IP地址:端口號/數據庫名?charset=utf8mb4',
}
然後把config文件配置到項目框架,在創建APP對象時配置。
二、獲取操作對象
1、下載安裝SQLAlchemy插件,命令行執行
pip install SQLAlchemy
pip install Flask-SQLAlchemy
2、獲取SQLAlchemy()的數據庫操作對象
from flask_sqlalchemy import SQLAlchemy
__all__ = ['db']
db = SQLAlchemy()
3、初始化對象
在項目的啓動文件中初始化數據庫,調用init_app()
# 數據庫初始化
db.init_app(app)
三、數據庫的操作
在Flask開發框架中,選擇使用Sqlalchemy開源軟件作爲數據庫的操作工具,不涉及數據庫的連接。
Sqlalchemy,提供SQL工具包和對象關係映射工具(ORM),通過其提供的API簡化SQL命令的執行,關鍵是一個DBSession對象。
在操作數據庫之前,需要生成相應表的models,models的創建在這裏不講解,請查看另一篇文章:暫無
(1)通過db的查詢
例子:
goods_orders = db.session.query(Order.order_id, Order.order_sn, Order.order_amount,
Order.order_status, Order.pay_status, Order.shipping_status,
Order.deliver_status, Order.aftersale_status, Order.add_time,
User.nickname, User.avatar).\
filter(Order.uid == User.uid).\
filter(Order.order_type == 1).\
filter(Order.pay_status == 2).\
order_by(Order.order_id.desc()).limit(10).all()
特點:
1、都是以db.session.query()開頭;
2、query()函數中,參數不能爲空,指定要查詢獲取的字段,可以是整張表,參數是非空的;
3、filter()函數中,指定查詢的篩選條件,等同於SQL的where條件語句;
4、order_by()函數中,用於指定排序的字段及排序的方向
5、limit()函數中,指定查詢的數據數量,達到限制值不在查詢數據
6、all()函數,指定返回查詢結果的所有數據,frist()函數,指定返回查詢結果的第一條數據;
7、offset()函數,指定偏移量,及忽略查詢的數據條數,如忽略前10條,常用語分頁
8、換行可用‘\’進行拼接
9、只有調用all()、first()時才查詢返回數據,前面的可作爲查詢器。
(2)直接對錶的查詢
例子:
q = GoodsCategories.query
categories = q.order_by(GoodsCategories.cat_id.desc()).offset((page-1)*page_size).limit(page_size).all()
特點:
1、以表名(models名).query開頭,query非函數,不能指定查詢的字段,即沒有();
2、其餘db的查詢一致
區別:db的形式必須指定要查詢的字段,而表查詢則默認查詢表的所有字段
四、查詢技巧
1、獲取最新的幾條數據:
思路:通過排序(自增id或插入時間等)order_by(),並限制數據獲取t條數 limit(int)
3、計算某字段的值的和:
思路:調用工具包的sum函數,在SQLALchemy的func類裏
db.session.query(func.sum(字段名).label('自定義計算結果的字段名')).filter().first()
計算結果只會有一個值,所以用first()而不是all()
4、連表查詢:
連表查詢,即表與表之間用關聯,例如,兩張表共擁有某個字段,邏輯上數據是同步的,但不包含表的所有字段,爲了獲取另一張表的數據,則可用連表查詢實現。
傳統:
利用共有的字段作爲篩選條件,循環搜索另一張,這樣數據庫的搜索次數則會很多,不推薦。
連表查詢例子:User表和Order表,兩表均有uid字段,則我們在查詢Order的使用,想同時獲取User的name和avatar字段的值,則:
db.sesssion.query(Order.id, Order.order_sn,User.name,User.avatar).filter(Order.uid == User.uid).all()或first()
5、表記錄總條數
db的count()函數,數據少可用,大不推薦,應使用動態記錄的方式來記錄總之(即專門維護一張表)
例子:db.session.query(某表字段).count()