14、flask-模型-models-单表的操作-增删改查
1.单表操作
1.修改表结构
接着上一步的数据迁移后、生成了表,接下来就要对表的操作
这里稍微对表结构改了一下
models.py
from .exts import db #导入db对象 class User(db.Model): # 表名 __tablename__ = 'user' # 字段 id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(50), unique=True) age = db.Column(db.Integer, default=1)
注意:修改表结构需要重新做数据迁移的操作:
1.flask db migrate
2.flask db upgrade
2.增加数据
from flask import Blueprint from .models import * #创建蓝图(路由) blue = Blueprint('user', __name__) @blue.route('/') def index(): return 'index' # 创建对象: 对象名(自定义) = 类名() -- > 该对象指的是models中的类 # 对象.属性名 = 表字段的值 # 单表操作 - 增删改查 # 1.增 @blue.route('/useradd/') def user_add(): # #添加一条数据 # # 创建对象 # user = User() # user.name = '张三' # user.age = 18 # db.session.add(user) #将对象user添加到session中 # db.session.commit() #将session中的数据提交到数据库中 #添加多条数据 users = [] for i in range(10, 30): user = User() user.name = '张' + str(i) user.age = i users.append(user) try: db.session.add_all(users) #将对象user添加到session中, all添加多个对象 db.session.commit() #将session中的数据提交到数据库中 事务提交 except Exception as e: db.session.rollback() #回滚 db.session.flush() #清空session return '添加失败' + str(e) #因为这里name是唯一值、所以如果重复添加会报错,将错误打印出来 # 添加失败(sqlite3.IntegrityError) UNIQUE constraint failed: user.name [SQL: INSERT INTO user (name, age) VALUES (?, ?) RETURNING id] [parameters: ('张10', 10)] (Background on this error at: https://sqlalche.me/e/20/gkpj) return '添加成功'
3.删除数据
from flask import Blueprint from .models import * #创建蓝图(路由) blue = Blueprint('user', __name__) @blue.route('/') def index(): return 'index' # 创建对象: 对象名(自定义) = 类名() -- > 该对象指的是models中的类 # 对象.属性名 = 表字段的值 # 2.删 # 先查到要删除的数据,再执行删除 @blue.route('/userdel/') def user_del(): # 先查到要删除的数据 user = User.query.first() #查询第一条数据 db.session.delete(user) db.session.commit() return '删除成功'
3.改
# 3.改 @blue.route('/userupdate/') def user_update(): # 先查到要修改的数据 user = User.query.first() user.age = 200 db.session.commit() return '修改成功'
4.查询
- 查询数据常用属性
- 过滤器
方法名 | 说明 |
---|---|
filter() | 把过滤器添加到原查询上,返回一个新的查询 |
filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |
limit() | 使用指定的值限制原查询返回的结果数量,返回一个新查询 |
offset() | 偏移原查询返回的结果、返回一个新的查询 |
order_by() | 根据指定条件对原查询结果进行排序、默认升序、降序需要导入from sqlalchemy import desc |
group_by() | 根据指定条件对原查询结果进行分组 |
- 常用查询
方法名 | 说明 |
---|---|
all() | 以列表形式返回查询的所有结果、返回列表 |
first() | 返回查询的第一个结果、如果没有结果返回 None |
first_or_404() | 返回查询的第一个结果、如果没有结果、则终止请求、返回404错误响应 |
get() | 返回指定主键对应的行、如果没有对应的行、则返回None |
get_or_404() | 返回指定主键对应的行、如果没有找到指定的主键、则终止请求、返回404错误响应 |
count() | 返回查询结果的数量 |
paginate() | 返回一个Paginate对象、他包含指定范围内的结果 - 一般做翻页 |
- 查询属性
属性名 | 说明 |
---|---|
contains() | 模糊查询 |
startswith() | 查询以什么开头的 |
endswitch() | 查询以什么结尾的 |
in_ | 查找在列表中的数据 |
__gt__ | 大于 |
__ge__ | 大于等于 |
__lt__ | 小于 |
__le__ | 小于等于 |
- 逻辑运算
需要导入:
from sqlalchemy import and_, or_, not_
- 与 and_ :filter(and_(条件),条件...)
- 或 or_ : filter(or_(条件),条件...)
- 非 not_ : filter(not_(条件),条件)
案例如下:
```plaintext from flask import Blueprint from sqlalchemy import desc, and_, or_, not_ from .models import * #创建蓝图(路由) blue = Blueprint('user', __name__) @blue.route('/') def index(): return 'index' # 创建对象: 对象名(自定义) = 类名() -- > 该对象指的是models中的类 # 对象.属性名 = 表字段的值 # 4.查 @blue.route('/userget/') def user_get(): # all(): 查询所有数据 users = User.query.all() #查询所有数据 # print(users) #打印的是对象、如果models中有__repr__方法,打印的是对象的属性值、如果没有__repr__方法,打印的是对象的内存地址 # print(User.query) #打印的是sql语句 # filter(): 过滤, 过滤条件,类似where 、支持链式查询、得到的是查询集 users = User.query.filter() # print(users) # get(): 根据主键查询、如果没有找到,返回None、 user = User.query.get(10) # print(user) # print(user.name, user.age) # 打印对象的属性值 # filter()与filter_by()的区别 # filter() # 类似where、支持不等值的条件查询、但条件要:对象.属性名 # filter_by() #用于等值 = 操作的过滤条件,而不支持 > < 等不等值的条件查询 # users = User.query.filter(User.age==18) # #users = User.query.filter(User.age>18) #返回的是查询集 users = User.query.filter_by(age=18) #可以直接属性值查询 # users = User.query.filter_by(age>18) #这是不支持的所以会报错 # print(list(users)) # 打印查询集使用list()强转打印 # filter_by 和 filter 都返回的是查询对象,需要通过 .first(), .all(), .scalar(), 等方法来获取实际的数据:如 # 这里的对象可换成相对应的对象名 - 只看方法 grade = Grade.query.filter_by(id=11).first() # 返回第一个匹配项 grades = Grade.query.filter_by(id=11).all() # 返回所有匹配项,即使理论上主键应 grade = Grade.query.filter(Grade.id == 11).first() grade = Grade.query.filter(Grade.id != 11).all() # first(): 查询第一条数据 # last(): 查询最后一条数据 user = User.query.first() # user = User.query.last() user = User.query.first_or_404() print(user.name, user.age) # count(): 查询数据条数 count = User.query.count() print(count) # limit(): 查询指定条数 # offset(): 查询指定条数,从指定位置开始 users = User.query.offset(3).limit(4) print(list(users)) # order_by(): 排序 users = User.query.order_by('age') # 升序 users = User.query.order_by(desc('age')) # 降序 需要导入 from sqlalchemy import desc print(list(users)) # 逻辑运算 and_ , or_ , not_ users = User.query.filter(User.age>20, User.age<30) # 且运算 users = User.query.filter(and_(User.age>20, User.age<30)) users = User.query.filter(or_(User.age>20, User.age<30)) users = User.query.filter(not_(User.age>20)) print(list(users)) # 查询属性 users = User.query.filter(User.name.contains('张')) # 模糊查询 类似 like # in_() : 查询属性 users = User.query.filter(User.name.in_(['张三', '李四'])) # 查找在列表中的数据 # startswith(): 查询以什么开头的数据 users = User.query.filter(User.name.startswith('张')) # endswith(): 查询以什么结尾的数据 users = User.query.filter(User.name.endswith('三')) # __gt__: 大于 # __lt__: 小于 # __ge__: 大于等于 # __le__: 小于等于 users = User.query.filter(User.age.__gt__(20)) users = User.query.filter(User.age.__ge__(20)) users = User.query.filter(User.age.__le__(20)) print(list(users)) return '查询成功'
本文作者:little小新
本文链接:https://www.cnblogs.com/littlecc/p/18326488
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步