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)碧囊, 也可以是遠程服務器。數(shù)據(jù)庫服務器上可以托管多個數(shù)據(jù)庫处渣,因此 database 表示要使用的 數(shù)據(jù)庫名芦昔。如果數(shù)據(jù)庫需要進行認證诱贿,username 和 password 表示數(shù)據(jù)庫用戶密令。
程序使用的數(shù)據(jù)庫 URL 必須保存到 Flask 配置對象的 SQLALCHEMY_DATABASE_URI 鍵中烟零。
3瘪松、使用

from flask_sqlalchemy import SQLAlchemy
baseURL = "mysql://root:Mysql123?!@localhost/testDB"
app.config['SQLALCHEMY_DATABASE_URI'] = baseURL #配置數(shù)據(jù)庫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 定義在數(shù)據(jù)庫中使用的表名锨阿,如果沒有定義會有一個默認值


最常用的SQLAlchemy列類型

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

最常使用的SQLAlchemy列選項

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

關聯(lián)兩張表宵睦,上面創(chuàng)建的兩張表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() 的參數(shù) 'roles.id' 表 明刊驴,這列的值是 roles 表中行的 id 值。
添加到 Role 模型中的 users 屬性代表這個關系的面向對象視角寡润。對于一個 Role 類的實例捆憎, 其 users 屬性將返回與角色相關聯(lián)的用戶組成的列表。db.relationship() 的第一個參數(shù)表 明這個關系的另一端是哪個模型梭纹。如果模型類尚未定義躲惰,可使用字符串形式指定。
db.relationship() 中的 backref 參數(shù)向 User 模型中添加一個 role 屬性变抽,從而定義反向關 系础拨。這一屬性可替代 role_id 訪問 Role 模型,此時獲取的是模型對象绍载,而不是外鍵的值诡宗。
大多數(shù)情況下,db.relationship() 都能自行找到關系中的外鍵逛钻,但有時卻無法決定把 哪一列作為外鍵僚焦。例如,如果 User 模型中有兩個或以上的列定義為 Role 模型的外鍵曙痘, SQLAlchemy 就不知道該使用哪列。如果無法決定外鍵立肘,你就要為 db.relationship() 提供 額外參數(shù)边坤,從而確定所用外鍵
5、數(shù)據(jù)庫操作
創(chuàng)建表(學習如何使用
模型的最好方法是在 Python shell 中實際操作)
創(chuàng)建表

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

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

     >>> 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)

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

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

     >>> 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])

為了把對象寫入數(shù)據(jù)庫笆凌,我們要調(diào)用 commit() 方法提交會話:

 >>> db.session.commit()

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

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

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

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

注意送悔,刪除與插入和更新一樣,提交數(shù)據(jù)庫會話后才會執(zhí)行
查詢行
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
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欠啤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呻右,更是在濱河造成了極大的恐慌跪妥,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件声滥,死亡現(xiàn)場離奇詭異眉撵,居然都是意外死亡,警方通過查閱死者的電腦和手機落塑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門纽疟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人憾赁,你說我怎么就攤上這事污朽。” “怎么了龙考?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵蟆肆,是天一觀的道長。 經(jīng)常有香客問我晦款,道長炎功,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任缓溅,我火速辦了婚禮蛇损,結果婚禮上,老公的妹妹穿的比我還像新娘坛怪。我一直安慰自己淤齐,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布袜匿。 她就那樣靜靜地躺著更啄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沉帮。 梳的紋絲不亂的頭發(fā)上锈死,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天贫堰,我揣著相機與錄音,去河邊找鬼待牵。 笑死其屏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的缨该。 我是一名探鬼主播偎行,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贰拿!你這毒婦竟也來了蛤袒?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤膨更,失蹤者是張志新(化名)和其女友劉穎妙真,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荚守,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡珍德,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矗漾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锈候。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敞贡,靈堂內(nèi)的尸體忽然破棺而出泵琳,到底是詐尸還是另有隱情,我是刑警寧澤誊役,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布获列,位于F島的核電站,受9級特大地震影響蛔垢,放射性物質發(fā)生泄漏蛛倦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一啦桌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧及皂,春花似錦甫男、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碍拆,卻和暖如春若治,著一層夾襖步出監(jiān)牢的瞬間慨蓝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工端幼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留礼烈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓婆跑,卻偏偏與公主長得像此熬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子滑进,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容