Flask-SQLAlchemy 簡單學習

SQLAlchemy官方文檔
Flask-SQLAlchemy快速入門中文文檔

1、安裝flask-sqlalchemy

pip3 install flask-sqlalchemy

2、安裝 flask-mysqldb

pip3 install flask-mysqldb

MySQL的URL格式mysql://username:password@hostname/database
hostname 表示 MySQL 服務所在的主機,可以是本地主機(localhost), 也可以是遠程服務器。數據庫服務器上可以托管多個數據庫,因此 database 表示要使用的 數據庫名。如果數據庫需要進行認證,username 和 password 表示數據庫用戶密令。
程序使用的數據庫 URL 必須保存到 Flask 配置對象的 SQLALCHEMY_DATABASE_URI 鍵中。
3、使用

from flask_sqlalchemy import SQLAlchemy
baseURL = "mysql://root:Mysql123?!@localhost/testDB"
app.config['SQLALCHEMY_DATABASE_URI'] = baseURL #配置數據庫url
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
db = SQLAlchemy(app)

4、定義模型User 和Role

class Role(db.Model):
    __tablename__='roles'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique=True)

    def __repr__(self):
        return '<Role %r>' % self.name

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(64),unique=True,index=True)
    def __repr__(self):
        return '<User %r>' % self.username

類變量 tablename 定義在數據庫中使用的表名,如果沒有定義會有一個默認值


最常用的SQLAlchemy列類型

D3AC45E3-3070-412E-986B-FEED416D7B9E.png

最常使用的SQLAlchemy列選項

3229883E-9DF9-4E92-8DB9-1BEC110C1B5F.png

關聯兩張表,上面創建的兩張表users和roles的關系圖如下

image.png

角色到用戶的一對多關系,因為一個角色可屬于多個用戶,而每個用戶只能有一個角色。
(思路小結:’建兩個表,一’方不動,’多’方添加一個外鍵字段)*

class Role(db.Model):
         # ...
         users = db.relationship('User', backref='role')
     class User(db.Model):
         # ...
         role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

如圖 5-1 所示,關系使用 users 表中的外鍵連接了兩行。添加到 User 模型中的 role_id 列 被定義為外鍵,就是這個外鍵建立起了關系。傳給 db.ForeignKey() 的參數 'roles.id' 表 明,這列的值是 roles 表中行的 id 值。
添加到 Role 模型中的 users 屬性代表這個關系的面向對象視角。對于一個 Role 類的實例, 其 users 屬性將返回與角色相關聯的用戶組成的列表。db.relationship() 的第一個參數表 明這個關系的另一端是哪個模型。如果模型類尚未定義,可使用字符串形式指定。
db.relationship() 中的 backref 參數向 User 模型中添加一個 role 屬性,從而定義反向關 系。這一屬性可替代 role_id 訪問 Role 模型,此時獲取的是模型對象,而不是外鍵的值。
大多數情況下,db.relationship() 都能自行找到關系中的外鍵,但有時卻無法決定把 哪一列作為外鍵。例如,如果 User 模型中有兩個或以上的列定義為 Role 模型的外鍵, SQLAlchemy 就不知道該使用哪列。如果無法決定外鍵,你就要為 db.relationship() 提供 額外參數,從而確定所用外鍵
5、數據庫操作
創建表(學習如何使用
模型的最好方法是在 Python shell 中實際操作)
創建表

python3 hello.py shell
from hello import db
db.drop_all() // 先刪除再創建
db.create_all()

插入行
下面這段代碼創建了一些角色和用戶:

     >>> from hello import Role, User
     >>> admin_role = Role(name='Admin')
     >>> mod_role = Role(name='Moderator')
     >>> user_role = Role(name='User')
     >>> user_john = User(username='john', role=admin_role)
     >>> user_susan = User(username='susan', role=user_role)
     >>> user_david = User(username='david', role=user_role)

模型的構造函數接受的參數是使用關鍵字參數指定的模型屬性初始值。注意,role 屬性也 可使用,雖然它不是真正的數據庫列,但卻是一對多關系的高級表示。這些新建對象的 id 屬性并沒有明確設定,因為主鍵是由 Flask-SQLAlchemy 管理的。現在這些對象只存在于 Python 中,還未寫入數據庫。因此 id 尚未賦值:

通過數據庫會話管理對數據庫所做的改動,在 Flask-SQLAlchemy 中,會話由 db.session 表示。準備把對象寫入數據庫之前,先要將其添加到會話中:

     >>> db.session.add(admin_role)
     >>> db.session.add(mod_role)
     >>> db.session.add(user_role)
     >>> db.session.add(user_john)
     >>> db.session.add(user_susan)
     >>> db.session.add(user_david)
或者簡寫成:
     >>> db.session.add_all([admin_role, mod_role, user_role,
     ...     user_john, user_susan, user_david])

為了把對象寫入數據庫,我們要調用 commit() 方法提交會話:

 >>> db.session.commit()

修改行
在數據庫會話上調用 add() 方法也能更新模型。我們繼續在之前的 shell 會話中進行操作,
下面這個例子把 "Admin" 角色重命名為 "Administrator":

     >>> admin_role.name = 'Administrator'
     >>> db.session.add(admin_role)
     >>> db.session.commit()

刪除行
數據庫會話還有個 delete() 方法。下面這個例子把 "Moderator" 角色從數據庫中刪除:

     >>> db.session.delete(mod_role)
     >>> db.session.commit()

注意,刪除與插入和更新一樣,提交數據庫會話后才會執行
查詢行
Flask-SQLAlchemy 為每個模型類都提供了 query 對象。

Role.query.all()
![2527CC33-3C96-4F76-9C90-245746018C7C.png](http://upload-images.jianshu.io/upload_images/970305-018986fcaf55be12.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

A6203AF5-2FC9-46EF-A05F-BF1503D7A229.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容