启动 admin:
D:\git\runcheng_admin_py>C:\Users\16915\AppData\Local\Microsoft\WindowsApps\python.exe D:\git\runcheng_admin_py\web\app.py
启动 user:
D:\git\runcheng_user>D:\Study\PythonStudy\Python311\python.exe D:\git\runcheng_user\web\app.py
注意:有时候python命令行项目能跑通,但是界面显示接口报404,是因为命令行该端口同时运行了两个项目
修改链接的数据库:在setting->evn.conf.py
①python查看类型使用 type()
1、如何设置页面分页
1、首先前端会传入page,page_size值
后端python修改:
1、定义的函数要给传参page,page_size
2、start_index = page_size * (page - 1)
: 计算当前页的起始索引,以便正确设置偏移量。
3、total = len(...)
: 获取符合条件的总记录数,用于后续分页操作中计算总页数或者做其他分页相关的逻辑。
4、sale_objs = ...limit(page_size).offset(start_index).all()
: 根据给定的business_group_id
、分页大小page_size
和起始索引start_index
,查询出相应的BusinessGroup_user
数据,并限制返回的数量为page_size
,偏移量为start_index
,实现了分页查询的效果。
start_index = page_size * (page - 1)
total = len(
db_session.query(BusinessGroup_user).filter(BusinessGroup_user.business_group_id == business_group_id,
BusinessGroup_user.status == 1,
BusinessGroup_user.mc_role_id == 0).all())
sale_objs = db_session.query(BusinessGroup_user).filter(BusinessGroup_user.business_group_id == business_group_id,
BusinessGroup_user.status == 1,
BusinessGroup_user.mc_role_id == 0).limit(
page_size).offset(start_index).all()
5、给total赋值
return_data["total"] = total
6、在views.py文件中添加page,page_size参数
@app.route('/runchen/admin/getBusinessGroupDetailById', methods=['POST', "GET"])
#@check_login
@not_check_login
def getBusinessGroupDetailById(data):
params = vld_params_encrypt(
data,
{
'business_group_id:int': {'default': 0},
'page_size:int': {'default': 10},
'page:int': {'default': 1},
})
params['ip'] = request.headers.get('X-Forwarded-For', '')
return commission_api.getBusinessGroupDetailById(**params)
2、如何对输入框输入进行模糊查询
#有传参company_name则获取过滤后的总数,没有就获取所有总数 total_query = db_session.query(Company).filter(Company.status == 1) if company_name: total_query = total_query.filter(Company.company_name.like(f"%{company_name}%")) total = len(total_query.all()) #有传参company_name则获取过滤后数据,没有就获取所有数据 obj_query = db_session.query(Company).filter(Company.status == 1) if company_name: obj_query = obj_query.filter(Company.company_name.like(f"%{company_name}%")) obj = obj_query.limit(page_size).offset(start_index).all()
绿色是前端传递的参数和后端接受的参数
橙色是数据库Company表里的字段
3、一些细节记录
①创建字典(可以理解为对象)
ret_dict = dict()
dict()
是Python中的一个内置函数,用于创建一个新的字典对象。可以用它来创建空字典或从其他可迭代对象(如元组、列表等)生成字典。
ret_dict={ } 和上面的写法等价
②创建列表(可以理解为数组),你可以使用list()
函数,如下
mc_roles = list()
mc_roles=[ ] 和上面等价
③
user_info = db_session.query(User).filter(User.rid == item.rid).first()
first()
方法用于从查询结果中获取第一个匹配的对象,并将其返回。在这种情况下,user_info
将包含满足条件的第一个用户对象。
④
return_data["created_time"] = business_info.created_time.strftime("%Y-%m-%d %H:%M:%S")
.strftime("%Y-%m-%d %H:%M:%S")
是 Python 中用于将日期时间对象格式化为指定格式的字符串的方法。在这里,"%Y-%m-%d %H:%M:%S"
是一个日期时间格式化字符串,具体含义如下:
%Y
:四位数的年份,如:2024%m
:两位数的月份(01-12)%d
:两位数的日期(01-31)%H
:小时(00-23)%M
:分钟(00-59)%S
:秒(00-59)
因此,.strftime("%Y-%m-%d %H:%M:%S")
将日期时间对象格式化为类似于 "2024-01-26 15:30:00" 这样的字符串表示形式。
只有这种类型的时间 2023-08-20 22:38:52 需要使用上面的方法转化,而像下面这两种时间就不用:2023-08-20 ,9:00-10:00 AM
4、设计数据库返回结构
接口响应数据结构:
数据库:
python:
def get_food(self,ip, page,page_size): result = ApiResult.get_inst() db_session = Session() api_data = {} # 最外层一级字典 total=0 #初始化定义赋值 start_index = page_size * (page - 1) fruit_obj=db_session.query(Food).filter(Food.statue == 2).limit(page_size).offset(start_index).all() #过滤出来Food表状态为2的数据 total=len(fruit_obj) #使用len()方法计算出总长度 fruit_list = list() #列表 if fruit_obj: for item in fruit_obj: fruit_data = dict() # 二级字典 fruit_data["food_id"] = item.food_id detail_data = dict() # 三级字典 detail_data["food_name"] = item.food_name detail_data["food_price"] = item.price detail_data["status"] = item.statue ①方法一: fruit_data["detail"] = [detail_data] ②方法二: detail_list = list() detail_list.append(detail_data) fruit_data["new_detail"]=detail_list fruit_list.append(fruit_data) api_data["fruit"] = fruit_list api_data["total"] = total db_session.close() return result.success(data=api_data)
当看到a["x"]=b结构时,a的结构就是字典。
当看到c.append()方法时,c的结构就是列表。.append()
方法是列表类型(list)的方法,用于向列表末尾添加新元素。
(暂时不理解)什么时候需要定义在循环外,什么时候需要定义在循环内
另外:
-
fruit_data["detail"] = [detail_data]
: 这种写法会将detail_data
放在一个列表中,作为值赋给键"detail"
。即使detail_data
本身是一个字典,也会被放在列表中,形成类似[detail_data]
的结构。 -
fruit_data["detail"] = detail_data
: 这种写法直接将detail_data
作为值赋给键"detail"
,不会放在列表中。所以,如果detail_data
本身就是一个字典,那么fruit_data["detail"]
就会是这个字典,而不是一个包含这个字典的列表。
5、多表连接查询 join
①当表字段名一致时
fruit_obj = db_session.query(Food.food_id,Food.food_name, Food.price,Fruit.color).join(Fruit, Food.food_id == Fruit.food_id).filter( Fruit.statue == 2).all()
query()的时候需要指定查询的表的字段 ,如果需要在查询结果中包含某个字段,该字段必须在查询中被指定。否则,如果尝试访问查询结果中未包含的字段,就会导致报错。
但是连接查询时,只会过滤出相同含义字段里面是相同的值的数据
另外,query查询时,里面必须是“表名.字段名”,不能是笼统的一张表名
②当表字段名不一致,但是字段含义一致时,可以在查询时使用 label()
方法为字段指定别名,然后在结果中使用这些别名来访问字段的值
fruit_obj = db_session.query(Food.food_id.label('id'),Fruit.fruit_id.label('id'),Food.food_name, Food.price,Fruit.color).join(Fruit, Food.food_id == Fruit.fruit_id).filter( Fruit.statue == 2).all()
下面引用赋值时也是使用别名
if fruit_obj:
for item in fruit_obj:
fruit_data = dict()
fruit_data["food_id"] = item.id
6、if判断语句
if "资讯" not in tab:
# 如果 tab 不包含 "资讯",执行相应的操作
pass
else:
# 如果 tab 包含 "资讯",执行其他操作
pass
模糊查询判断
if tab.find("资讯") == -1:
# 如果 tab 中不包含 "资讯" 字符串,执行相应的操作
pass
else:
# 如果 tab 中包含 "资讯" 字符串,执行其他操作
pass
在上面的示例中,find()
方法会返回子字符串在字符串中的索引,如果未找到,则返回 -1。因此,通过判断返回值是否为 -1,你可以确定是否包含 "资讯" 子字符串。
7、注意:
在数据库中,NULL 值表示缺失或未知的值,而在 Python 中,NULL 值对应的是 None。因此,当您在 Python 中对数据库进行过滤时,您应该使用 None 来表示空值,而不是 NULL。
就是说空值在数据库用NULL表示,在python中用None表示
8、转换为字符串类型
在JavaScript中,转换为字符串类型通常使用 .toString()
方法
在Python中,可以使用 str()
函数将对象转换为字符串类型
9、query.append()
方法只接受一个参数
下面是错误示例:query.append(Reservation.link_rid == link_rid, Reservation.status != 1)
可以使用 and_()
函数将这多个过滤条件连接起来
正确示例:query.append(and_(Reservation.link_rid == link_rid, Reservation.status != 1))
使用 append
方法将一个列表添加到另一个列表中会导致嵌套列表,而使用 extend
方法则会将列表中的元素扁平地添加到另一个列表中。
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.append(list2) # 嵌套列表
print(list1) # 输出: [1, 2, 3, [4, 5, 6]]
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2) # 扁平地添加元素
print(list1) # 输出: [1, 2, 3, 4, 5, 6]