1. 基本概念
在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。
会话用db.session表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提交会话。
在Flask-SQLAlchemy中,查询操作是通过query对象操作数据。
最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。
db.session.add(role) 添加到数据库的session中
db.session.add_all([user1, user2]) 添加多个信息到session中
db.session.commit() 提交数据库的修改(包括增/删/改)
db.session.rollback() 数据库的回滚操作
db.session.delete(user) 删除数据库(需跟上commit)
2.在视图函数中定义模型类
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
app = Flask(__name__)
# SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:这里填密码@localhost:3306/这里填数据库名字"
# 配置数据库的地址 mysql://用户名:密码@本地地址/表名
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:[email protected]:3306/flask_sql_demo'
# 跟踪数据库的修改--> 不建议开启 未来的版本中会移除
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# 数据库的模型类,需要继承db.Model
class Role(db.Model):
# 定义表名
__tablename__ = 'roles'
# 定义字段
# db.Column
id = db.Column(db.Integer, primary_key=True)
role_name = db.Column(db.String(16), unique=True)
# 在一的一方,写关联
# users=db.relationship('User') :表示和User表发生了关联,增加了一个users的属性
# backref='role' :表示role是User要用的属性
users = db.relationship('User', backref='role')
# repr() 方法显示一个可读字符串
def __repr__(self):
return "" % (self.role_name, self.id)
class User(db.Model):
# 定义表名
__tablename__ = 'users'
# 定义字段
# db.Column
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
email = db.Column(db.String(32), unique=True)
password = db.Column(db.String(32))
# db.ForeignKey('roles.id') 表示是外键,表名.id
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
# User希望有role属性,但是这个属性的定义,需要在另一个模型中定义
# repr() 方法显示一个可读字符串
def __repr__(self):
return "" % (self.name, self.id, self.email, self.password)
@app.route('/')
def hello_world():
return 'Hello World!'
# 删除表
db.drop_all()
# 创建表
db.create_all()
ro1 = Role(role_name='admin')
ro2 = Role(role_name='user')
db.session.add_all([ro1, ro2])
db.session.commit()
us1 = User(name='wang', email='[email protected]', password='111', role_id=ro1.id)
us2 = User(name='li', email='[email protected]', password='111', role_id=ro1.id)
us3 = User(name='han', email='[email protected]', password='111', role_id=ro2.id)
us4 = User(name='chen', email='[email protected]', password='111', role_id=ro1.id)
us5 = User(name='ma', email='[email protected]', password='111', role_id=ro2.id)
us6 = User(name='liu', email='[email protected]', password='111', role_id=ro1.id)
us7 = User(name='wei', email='[email protected]', password='111', role_id=ro2.id)
db.session.add_all([us1, us2, us3, us4, us5, us6, us7])
db.session.commit()
if __name__ == '__main__':
app.run(debug=True)
#### 2.2 数据的增删改
# 导入app.py
In [2]: from app import *
# 添加角色
In [4]: role=Role(role_name='admin')
In [5]: db.session.add(role)
In [6]: db.session.commit()
# 添加用户
In [7]: user=User(name='韩寒',role_id=role.id)
In [8]: db.session.add(user)
In [9]: db.session.commit()
# 修改用户名
In [10]: user.name
Out[10]: '韩寒'
In [11]: user.name='小韩'
In [12]: db.session.commit()
In [13]: user.name
Out[13]: '小韩'
# 删除用户
In [14]: db.session.delete(user)
In [15]: db.session.commit()
# 添加多个用户 add_all([对象])
In [18]: user=User(name='小韩',role_id=role.id)
In [19]: user1=User(name='韩寒',role_id=role.id)
In [21]: db.session.add_all([user,user1])
In [22]: db.session.commit()
3 模型之间的关联
一对多
class Role(db.Model):
...
#关键代码
user = db.relationship('User', backref='role')
...
class User(db.Model):
...
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
# 添加一个角色和两个用户
In [2]: role=Role(role_name='admin')
In [3]: db.session.add(role)
In [5]: db.session.commit()
In [6]: user1=User(name='zs',role_id=role.id)
In [7]: user2=User(name='ls',role_id=role.id)
In [8]: db.session.add_all([user1,user2])
In [9]: db.session.commit()
# 实现关系引用查询
In [10]: role.users
Out[10]: [<User:zs 1 None None>, <User:ls 2 None None>]
In [11]: user1.role
Out[11]: <Role:admin 1>
In [12]: user1.role.role_name
Out[12]: 'admin'
查询演练
In [1]: from app import *
# 1. 查询所有用户数据
In [3]: User.query.all()
Out[3]:
[<User:wang 1 wang@qq.com 111>,
<User:li 2 li@qq.com 111>,
<User:han 3 han@qq.com 111>,
<User:chen 4 chen@qq.com 111>,
<User:ma 5 ma@qq.com 111>,
<User:liu 6 liu@qq.com 111>,
<User:wei 7 wei@qq.com 111>]
# 2. 查询有多少个用户
In [4]: User.query.count()
Out[4]: 7
# 3. 查询第1个用户
In [5]: User.query.first()
Out[5]: <User:wang 1 wang@qq.com 111>
# 4. 查询id为4的用户[3种方式]
In [7]: User.query.get(4)
Out[7]: <User:chen 4 chen@qq.com 111>
In [10]: User.query.filter_by(id=4).first()
Out[10]: <User:chen 4 chen@qq.com 111>
In [11]: User.query.filter(User.id==4).first()
Out[11]: <User:chen 4 chen@qq.com 111>
# 查询id大于或等于4的用户
In [23]: User.query.filter(User.id>=4).all()
Out[23]:
[<User:chen 4 chen@qq.com 111>,
<User:ma 5 ma@qq.com 111>,
<User:liu 6 liu@qq.com 111>,
<User:wei 7 wei@qq.com 111>]
# filter_by直接用属性名,比较用=, filter用类名.属性名,比较用==
# filter_by用于查询简单的列名,不支持比较运算符
# filter比filter_by的功能更强大,支持比较运算符,支持or_、in_等语法。