一、庫安裝
Flask-SQLAlchemy 2
SQLAlchemy 1.0.8
二、進入venv
三、切換到項目Sample\ 文件夾,進入manager.py 的shell
python manager.py shell
四、創建data.sqlite數據庫
from app import db from app import models db.create_all()
執行完最后一條命令后,在Sample\app下就會生成一個data.sqlite文件
五、在Pycharm中導入數據庫,方便可視化
Data Source -> Sqlite(Xerial)
然后進行如下操作
點擊OK后,會發現已經導入成功了
六、在shell模式下操作數據
1. 增(寫入數據)
>>> from app import db >>> from app import models >>> from app.models import User,Role >>> admins = Role(name='administrators') >>> mod = Role(name='moderator') >>> db.session.add(admins) >>> db.session.add(mod) >>> db.session.commit() #或者兩條一起添加 #db.session.add([admins,mod])
注意,對數據庫增刪改查,都必須進行commit()方法才能寫入數據庫。
現在來查看下,到底有沒有寫入?雙擊roles表,看到了我們寫入的兩行記錄
2. 刪(刪除數據)
# 說明一下:表的每行記錄都是一個對象 # 例如上面:admins和mod都是對象,name是其屬性 >>> admins.name u'administrators' # 為什么說明這點,因為刪除行就是刪除對象 >>> db.session.delete(admins) >>> db.session.commit() # 刪除成功
3.改(修改數據)
# 通過對屬性重新賦值,添加,提交事務進行修改數據 mod.name='moderators-new' db.session.add(mod) db.session.commit()
4. 查(查詢數據)
# query返回的是包含所有記錄的查詢對象(BaseQuery) >>> Role.query <flask_sqlalchemy.BaseQuery object at 0x0000000004936E10> # query之后如果需要對記錄進行條件篩選,要加上過濾函數,返回過濾后的查詢對象(BaseQuery),可以多次執行過濾函數 >>> Role.query.filter_by(name='admins') <flask_sqlalchemy.BaseQuery object at 0x0000000004A2C438> # 過濾函數之后,加執行函數,返回是記錄對象(如果是多行怎么辦),賦值為一個對象名Admin >>> Role.query.filter_by(name='administrators').first() <app.models.Role object at 0x0000000004A13F98> #Admin對象的屬性,就相當於單元格的值 >>> Admin = Role.query.filter_by(name='administrators').first() >>> Admin.name u'administrators'
5. 表之間的關聯
還記得我們之前定義models.py中的Role和User類時,那個relationship嗎,關鍵是參數backref
先來看看我們Role表中的對象admins,name=administrator,id為3
我們知道這個Role表中的id和User表中的role_id(外鍵)是對應連接的。
那我們在往User表寫入數據的時候,還要寫入對應的role_id,有個一步到位的方法,就是把Role行的對象作為參數傳給定義類時backref的值(這里是role)
他就會自動獲取id,並傳給role_id
執行代碼
>>> Bikmin = User(name='Bikmin',roles=admins) >>> db.session.add(Bikmin) >>> db.session.commit()
看看效果,role_id為3,對應上了
這里說一下,query()和get()的區別
1. query() 返回所有記錄的查詢對象
2. get() 使用的主鍵查詢
示例
>>> Role.query.get(2).name u'moderator'
返回的是moderator,和id一樣
要講SQLAlchemy查詢語句轉成原生的SQL語句,只需用str()即可
str(Role.query.filter_by(name='administrators').all())
如果在第一次使用shell會話的時候,創建了行的Python對象,那么再關閉Shell后,再打開,這些對象不能再使用,必須重新創建
admins = Role.query.filter_by(name='administrators').first()
參考文章:選擇(Select),插入(Insert), 刪除(Delete)