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列類型
最常使用的SQLAlchemy列選項
關聯(lián)兩張表宵睦,上面創(chuàng)建的兩張表users和roles的關系圖如下
角色到用戶的一對多關系,因為一個角色可屬于多個用戶墅诡,而每個用戶只能有一個角色壳嚎。
(思路小結:’建兩個表桐智,一’方不動,’多’方添加一個外鍵字段)*
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)