文章目录
一、查询操作
- 通过对模型类的query属性调用可选的过滤方法,我们就可以获取到单个或多个记录(记录以模型类的实例表示)。查询语句如下:
<模型类>.query.<过滤方法(可选)>.<查询方法>
下面是一些常用的过滤方法:
- filter():使用指定的规则
过滤记录
,返回新产生的查询对象 - filter_by():使用指定规则
过滤记录(以关键字表达式的形式)
,返回新产生的查询对象 - order_by():根据指定条件
对记录进行排序
,返回新产生的查询对象 - group_by():根据指定条件
对记录进行分组
,返回新的查询对象
下面是一些常用的查询方法:
- all():返回包含
所有查询记录的列表
- first():返回查询的
第一条记录
,如果未找到,则返回None - get(id):
传入主键值作为参数
,返回指定主键值的记录,如果未找到,则返回None - count():返回
查询结果的数量
- first_or_404():返回查询的第一条记录,如果未找到,则返回404错误响应
- get_or_404(id):传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回404错误响应
- paginate():
返回一个Pagination对象,可以对记录进行分页处理
if __name__ == '__main__':
# 查询
# select * from users where users.name='Tom';
user = User.query.filter(User.name == 'Tom')
print(user)
user = User.query.filter(User.name == 'Tom').all()
print(user)
# 提交会话
db.session.commit()
# 运行
app.run(debug=True)
二、增、删、改操作
基本概念
- 在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。
会话用db.session表示
。在准备把数据写入数据库前,要先将数据添加到会话中然后调用commi()方法提交会话
。
- 在Flask-SOLAlchemy中,查询操作是通过query对象操作数据。
- 最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。
db.session.add(role) 添加到数据库的session中
db.session.add_all([user1,user2]) 添加多个信息到session中
db.sessica.commit() 提交数据库的修改(包括增、删、改)
db.session.rollback() 数据库的回滚操作
db.session.delete(user) 删除数据库(需要跟上commit)
1.数据增加
- db.session.
add
(role) 添加单个信息到数据库的session中 - db.session.
add_all
([user1,user2]) 添加多个信息以list的形式到session中
if __name__ == '__main__':
# 删除原有
db.drop_all()
# 创建新的表
db.create_all()
# 插入数据
# roles表
role1 = Role(id=1, role="admin")
role2 = Role(id=2, role="common_user")
# 添加到session中
db.session.add_all([role1, role2])
# 提交会话
db.session.commit()
# users表
user1 = User(id=1, name="Jack", role_id=2)
user2 = User(id=2, name="Tom", role_id=1)
user3 = User(id=3, name="Alice", role_id=2)
# 添加到session中
db.session.add_all([user1,user2,user3])
# 提交会话
db.session.commit()
# 运行
app.run(debug=True)
结果展示
返回顶部
2.数据删除
- 获取到要删除的记录
user = User.query.get(3)
注意:查询记录get的参数是主键的值,这里要查询users表中主键值为1的记录 - 定义删除
db.session.delete(user)
- 提交会话
db.session.commit()
# -*- coding: utf-8
# @Time : 2020/12/19 11:30
# @Author : ZYX
# @File : data_delete.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 创建Flask对象
app = Flask(__name__)
# 配置数据库信息
# 数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟踪数据库的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 创建数据库对象
db = SQLAlchemy(app)
'''
创建两张表:用户表、用户身份表
其中通过id将用户与身份关联起来
'''
# 创建数据库模型,需要继承自 db.Model
class Role(db.Model):
# 定义表名
__tablename__ = "roles"
# 定义字段及其属性
# db.Model 表示是一个字段
id = db.Column(db.Integer, primary_key=True) # id字段,int类型,主键
role = db.Column(db.String(16), unique=True) # name字段,string类型,唯一
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
# db.ForeignKey("roles.id") 表示是一个外键,声明时需要指定:表名.字段名
role_id = db.Column(db.Integer, db.ForeignKey("roles.id")) # 声明该字段为roles的外键
@app.route('/index')
def index():
pass
if __name__ == '__main__':
# 查找出要删除的数据
user = User.query.get(3)
print(user)
# 定义删除
db.session.delete(user)
# 提交会话
db.session.commit()
# 运行
app.run(debug=True)
注意:在删除的时候使用该方法后会报错,但是查询结果显示已经执行了删除操作,网上查找也没找到正确的解释,稍后会更新~
返回顶部
3.数据修改
- 获取到要修改的记录
user = User.query.get(1)
注意:查询记录get的参数是主键的值,这里要查询users表中主键值为1的记录 - 定义修改的内容
user.name = "li"
- 提交会话
db.session.commit()
# -*- coding: utf-8
# @Time : 2020/12/19 10:38
# @Author : ZYX
# @File : data_update.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 创建Flask对象
app = Flask(__name__)
# 配置数据库信息
# 数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟踪数据库的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 创建数据库对象
db = SQLAlchemy(app)
'''
声明两张表及其结构:用户表、用户身份表
其中通过id将用户与身份关联起来
'''
# 创建数据库模型,需要继承自 db.Model
class Role(db.Model):
# 定义表名
__tablename__ = "roles"
# 定义字段及其属性
# db.Model 表示是一个字段
id = db.Column(db.Integer, primary_key=True) # id字段,int类型,主键
role = db.Column(db.String(16), unique=True) # name字段,string类型,唯一
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
# db.ForeignKey("roles.id") 表示是一个外键,声明时需要指定:表名.字段名
role_id = db.Column(db.Integer, db.ForeignKey("roles.id")) # 声明该字段为roles的外键
@app.route('/index')
def index():
pass
if __name__ == '__main__':
# 取到要修改的记录
user = User.query.get(1)
# 定义修改的内容
user.name = "li"
# 提交会话
db.session.commit()
# 运行
app.run(debug=True)
注意:在编写程序的时候需要声明表的结构
返回顶部
三、关系引用
仅仅为了方便查询,我们需要一些属性便利地去查询数据,但是又不想让这些属性出现在数据库的字段中。比如:我们想直接通过user查询出用户所属的角色名,一般都是先查找出用户对应的角色编号,通过编号到Role表中去查询对应的角色。
# -*- coding: utf-8
# @Time : 2020/12/20 8:36
# @Author : ZYX
# @File : data_relationship.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 创建Flask对象
app = Flask(__name__)
# 配置数据库信息
# 数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟踪数据库的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 创建数据库对象
db = SQLAlchemy(app)
'''
创建两张表:用户表、用户身份表
其中通过id将用户与身份关联起来
'''
# 创建数据库模型,需要继承自 db.Model
class Role(db.Model):
# 定义表名
__tablename__ = "roles_rs"
# 定义字段及其属性
# db.Model 表示是一个字段
id = db.Column(db.Integer, primary_key=True) # id字段,int类型,主键
role = db.Column(db.String(16), unique=True) # name字段,string类型,唯一
# 添加关联
# users = db.relationship('User', backref='role') 表示和User模型发生了关联,增加了一个users属性
# backref = 'role' 反向引用,表示role是User要用的属性
users = db.relationship('User',backref ='role')
# repr()方法显示一个可读的字符串
def __repr__(self):
return '<Role:%s %s>' % (self.role,self.id)
class User(db.Model):
__tablename__ = "users_rs"
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") 表示是一个外键,声明时需要指定:表名.字段名
role_id = db.Column(db.Integer, db.ForeignKey("roles_rs.id")) # 声明该字段为roles的外键
# User希望有role属性,但是这个属性的定义,需要在另一个模型中定义
# repr()方法显示一个可读的字符串,相当于重写toString
def __repr__(self):
return '<User:%s %s %s %s >' % (self.id,self.name,self.email,self.password)
@app.route('/index')
def index():
pass
if __name__ == '__main__':
db.drop_all()
db.create_all()
# 添加元素
role1 = Role(id=1,role="admin")
role2 = Role(id=2, role="user")
db.session.add_all([role1,role2])
# 提交会话
db.session.commit()
# 添加元素
user1 = User(id=1,name="Tom",email="1442314632@.qq.com",password="123",role_id=2)
user2 = User(id=2,name="Jack",email="3519232933@.qq.com",password="123",role_id=1)
db.session.add_all([user1,user2])
# 提交会话
db.session.commit()
# 运行
app.run(debug=True)
users = db.relationship('User', backref='role')
表示和User模型发生了关联,增加了一个users属性backref = 'role'
反向引用,表示role是User方便查询时要用的属性
# 添加关联
users = db.relationship('User',backref ='role')
通过表的生成也可以看出,relationship声明的字段并不会被真正的添加到表中!!!
- 查询
if __name__ == '__main__':
# 查询
# 查询id为1的用户信息
user = User.query.filter(User.id == 1).first()
# 查询所有Role模型内的数据列表
role = Role.query.all()
# 输出user查询结果
print(user)
# 输出关联后的快速查询结果,id为1的用户角色是普通用户,id为2
print(user.role)
# 遍历Role模型数据,输出对应的用户信息
for each in role:
print(each.users)
# 提交会话
db.session.commit()
# 运行
app.run(debug=True)
四、实现简单的查询
- 创表插入数据
# -*- coding: utf-8
# @Time : 2020/12/20 9:57
# @Author : ZYX
# @File : data_query.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 创建Flask对象
app = Flask(__name__)
# 配置数据库信息
# 数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟踪数据库的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 创建数据库对象
db = SQLAlchemy(app)
'''
创建两张表:用户表、用户身份表
其中通过id将用户与身份关联起来
'''
# 创建数据库模型,需要继承自 db.Model
class Role(db.Model):
# 定义表名
__tablename__ = "roles_query"
# 定义字段及其属性
# db.Model 表示是一个字段
id = db.Column(db.Integer, primary_key=True) # id字段,int类型,主键
role = db.Column(db.String(16), unique=True) # name字段,string类型,唯一
# 添加关联
# users = db.relationship('User', backref='role') 表示和User模型发生了关联,增加了一个users属性
# backref = 'role' 反向引用,表示role是User要用的属性
users = db.relationship('User', backref='role')
# repr()方法显示一个可读的字符串
def __repr__(self):
return '<Role:%s %s>' % (self.role, self.id)
class User(db.Model):
__tablename__ = "users_query"
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") 表示是一个外键,声明时需要指定:表名.字段名
role_id = db.Column(db.Integer, db.ForeignKey("roles_query.id")) # 声明该字段为roles的外键
# User希望有role属性,但是这个属性的定义,需要在另一个模型中定义
# repr()方法显示一个可读的字符串
def __repr__(self):
return '<User:%s %s %s %s >' % (self.id, self.name, self.email, self.password)
@app.route('/index')
def index():
pass
if __name__ == '__main__':
# 创表
db.drop_all()
db.create_all()
# 插入一条数据
ro1 = Role(id=1,role='admin')
db.session.add(ro1)
db.session.commit()
# 再次插入一条数据
ro2 = Role(id=2,role='user')
db.session.add(ro2)
db.session.commit()
us1 = User(id=1, name='Wang', email="wang@163.com", password="123456", role_id=ro1.id)
us2 = User(id=2, name='Zhang', email='zhang@189.com', password="201512", role_id=ro2.id)
us3 = User(id=3, name='Chen', email='chen@126.com', password="987654", role_id=ro2.id)
us4 = User(id=4, name='Zhou', email="zhou@163.com", password="456789", role_id=ro1.id)
us5 = User(id=5, name='Tang', email="tang@163.com", password='158104', role_id=ro2.id)
us6 = User(id=6, name='Wu', email='wu@163.com', password='5623514', role_id=ro2.id)
us7 = User(id=7, name='Qian', email="qian@gmail.com", password='1543567', role_id=ro1.id)
us8 = User(id=8, name='Liu', email='Liu@itheina.com', password="867322", role_id=ro1.id)
us9 = User(id=9, name='Li', email="Li@163.com", password="4526342", role_id=ro2.id)
us10 = User(id=10, name='Sun', email='sun@163.com', password='235523', role_id=ro2.id)
db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])
db.session.commit()
# 运行
app.run(debug=True)
1.查询所有用户信息
if __name__ == '__main__':
# 1.查询所有用户数据
all_user_info = User.query.all()
for user in all_user_info:
print(user)
# 提交事务
db.session.commit()
app.run(debug=True)
2.查询有多少个用户
if __name__ == '__main__':
# 2.查询有多少个用户
users_count = User.query.count()
print(users_count)
db.session.commit()
app.run(debug=True)
3.查询第一个用户
if __name__ == '__main__':
# 3.查询第一个用户
first_user = User.query.first()
print(first_user)
db.session.commit()
app.run(debug=True)
4.查询id为3的用户 ---- 3种方式
if __name__ == '__main__':
# 4.查询id为4的用户
user_s1 = User.query.filter(User.id == 4).first()
user_s2 = User.query.get(4)
user_s3 = User.query.filter_by(id=4).first()
print(user_s1)
print(user_s2)
print(user_s3)
# 提交事务
db.session.commit()
app.run(debug=True)