Flask

通过 flask-migrate 发号施令给flask-sqlalchemy 来 影响映射

python flask-sqlalchemy MYSQL
CLASS类 通过flask-sqlalchemy映射
db.Column() 来映射 表中的列
class类对象 通过flask-sqlalchemy映射 表中的一条记录
db.Integer 两边不同语言的代码相同的作用 int
db.String(15) varchar(15)
db.Datetime datetime

class User(db.Model): ------------> 映射的就是一张 user的表

注意事项:

1 要在app.py 中导入xxxmodel.py

2 flask db init - - - - -》 会产生一个migrations版本文件夹

flask db migrate --------> 在migrations文件夹的version里面产生一个版本py文件

falsk db upgrade - -- -> 利用版本py文件和映射关系 在数据库里创建表

数据库查询

python 后端 操作数据库 和 数据库本身操作代码对比:

python 复制代码
users= User.query.all()   # select * from user;

user = User.query.filter_by(username=username) # select * from user where username='xxx';
id username password phone
1 zhangsan 111 23
2 zhangsan 222 33
3 lisi 333 44

上述列表 经过 user_list = User.query.filter_by(username=zhangsan) 代码后

得到的仍然是一个列表

id username password phone
1 zhangsan 111 23
2 zhangsan 222 33

小结:

查询所有: 模型类.query.all() ~ select * from user;

有条件查询: 模型类.query.filter_by(字段名 = 值) ~ select * from user where 字段=值;

MYSQL根据条件查找:

select * from user where age>17 and gender='男';

select * from user where username like 'zhang%';

select * from user where rdatetime> xxx and rdatetime < xxx;

user = User.query.get(2) #根据主键查询用户,返回值是对象

PYTHON根据条件查找:

.filter_by()内部是 字段=值得模式

.filter() 是==的布尔模式 .filter(模型名.字段名>18)

user_list = User.query.filter(User.username == 'zhangsan') #返回的是一串对应关系的语句

例如: SELECT user.id AS user_id, user.username AS user_username, user.password AS user_password, user.phone AS user_phone, user.isdelete AS user_isdelete, user.rdatetime AS

user_rdatetime. FROM user Where user.username = %(username_1)s

user = User.query.filter(User.username == 'zhangsan').first() # 返回的是第一个对象

zhangsan

user = User.query.filter(User.username == 'zhangsan').all() # 返回的是所有符合条件的列表[<User 3>]

user_list = User.query.filter(User.username.startswith('z')).all()

select * from user where username like 'z%';

python 复制代码
{
  
  { users | length }}     # 3
 
{
  
  { users }}    #  [<User 1>,<User 4>,<User 5>]
筛选
not_ and_ or_ lt gt > < != .filter() .contains() .endswith() .startswith() .like(%)
python 复制代码
user_list = User.query.filter(User.username.endswith(z)).all()

# select * from user where username like '%z';

user_list = User.query.filter(User.username.contains('z')).all()

# select * from user where username like '%z%';

user_list = User.query.filter(User.username.like('%沐浴露%')).all  

#select * from user where username like '%沐浴露%';

#like 使用 一定要加% 才可以
user_list = User.query.filter(User.username.ilike('沐浴露')).all  #ilike 忽略大小写  



#  多条件查询    or_  and  
user_list = User.query.filter(or_(User.username.endswith(z),User.username.contains('i'))).all()

# or_       ...., 逗号 后面是另一个条件
# select * from user where username like 'z%' or username like '%i%';

user_list = User.query.filter(and_(User.username.contains('i'),User.rdatetime < '2025-05-25 10:20:50')).all()
# select * from user where rdatetime <'2025-05-25 10:20:50';
# select * from user where username like '%i%' and rdatetime <'2025-05-25 10:20:50';

user_list = User.query.filter(and_(User.username.contains('i'),User.rdatetime.__lt__('2025-05-25 10:20:50') )).all()
# .__lt__()   和  <  一个效果 都是 小于的意思 

#补充: __gt__ 大于    __lt__ 小于   __ge__  大于等于   __le__ 小于等于    ---》通常应用在某个范围(整型、日期) 也可以使用>  < >= <=  !=  
from sqlalchermy import and_, or_ not_

user_list = User.query.filter(not_(User.username.containes('i'))).all()



#从 18 19 20 17 21 22 ....选择
#select * from user where age in [17,18, 20];

User.age.between(15, 30)


user_list = User.query.filter(User.phone.in_(['13844940855','13844940844'])).all()
#找出这俩号的人儿
.order_by 排序

user_list = User.query.filter(User.username.contains('z')).order_by('rdatetime').all()

user_list = User.query.filter(User.username.contains('z')).order_by(-User.rdatetime).all() #倒序

user_list = User.query.filter(User.username.contains('z')).order_by('-rdatetime').all() #报错

user_list = User.query.order_by(-User.id).all() # 倒序排序

如果想倒序排序 .order_by(-模型类.字段)

limit 限制 和 offset
python 复制代码
user = User.query.order_by('id').limit(2)  #报错

{
  
  {user | length}}  #报错

TypeError: object of type 'BaseQuery' has no len()
# 返回的不是列表

比如说 表中 有 1 2 3 4 四个对象

user_list = User.query.order_by('id').limit(2).all() # 返回的是列表 [<user 1>,< user 2>] 默认获取前两个

user_list = User.query.offset(2).limit(2).all() #返回的是列表 [<user 3>,< user 4>] 跳过2条再获取2条

#offset 是一个偏移 即 偏移两个 再拿2个

相关推荐
失业写写八股文1 小时前
Spring基础:Spring的事物哪些情况下会失效
java·后端·spring
程序趣谈2 小时前
算法随笔_74: 不同路径_1
数据结构·python·算法
失业写写八股文3 小时前
Redis中keys命令的缺点
redis·后端
Cheng_08293 小时前
LLM自动化评测
python
朱剑君3 小时前
用Python打造AI玩家:挑战2048,谁与争锋
人工智能·python
问道飞鱼4 小时前
【Springboot知识】开发属于自己的中间件健康监测HealthIndicate
spring boot·后端·中间件·healthindicate
JM丫4 小时前
python基础
笔记·python
luckyext5 小时前
Postman用JSON格式数据发送POST请求及注意事项
java·前端·后端·测试工具·c#·json·postman
天才测试猿5 小时前
接口自动化测试用例
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
程序视点6 小时前
Redis集群机制及一个Redis架构演进实例
java·redis·后端