通过 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 后端 操作数据库 和 数据库本身操作代码对比:
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%';
{{ users | length }} # 3{{ users }} # [<User 1>,<User 4>,<User 5>]
筛选
not_ and_ or_ __lt__ __gt__ > < != .filter() .contains() .endswith() .startswith() .like(%)
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
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个