Flask入門之SQLAlchemy數據庫連接操作(第15講)


一、庫安裝

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)

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM