Flask-SQLAlchemy 2
SQLAlchemy 1.0.8
python manager.py shell
from app import db from app import models db.create_all()
執行完最後一條命令後,在Sample\app下就會生成一個data.sqlite文件html
Data Source -> Sqlite(Xerial)python
而後進行以下操做sql
點擊OK後,會發現已經導入成功了shell
>>> 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表,看到了咱們寫入的兩行記錄flask
# 說明一下:表的每行記錄都是一個對象 # 例如上面:admins和mod都是對象,name是其屬性 >>> admins.name u'administrators' # 爲何說明這點,由於刪除行就是刪除對象 >>> db.session.delete(admins) >>> db.session.commit() # 刪除成功
# 經過對屬性從新賦值,添加,提交事務進行修改數據 mod.name='moderators-new' db.session.add(mod) db.session.commit()
# 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'
還記得咱們以前定義models.py中的Role和User類時,那個relationship嗎,關鍵是參數backrefsession
先來看看咱們Role表中的對象admins,name=administrator,id爲3app
咱們知道這個Role表中的id和User表中的role_id(外鍵)是對應鏈接的。函數
那咱們在往User表寫入數據的時候,還要寫入對應的role_id,有個一步到位的方法,就是把Role行的對象做爲參數傳給定義類時backref的值(這裏是role)spa
他就會自動獲取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()