Flask_Web_數據庫操作

一、配置項目的數據庫(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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章