网站如何做触屏滑动信和财富网站开发

张小明 2025/12/22 14:43:14
网站如何做触屏滑动,信和财富网站开发,wordpress去除顶部广告,建设银行违法网站SQLAlchemy查询进阶#xff1a;过滤、排序与聚合 - 手把手带你从基础查询到实战分析 文章目录SQLAlchemy查询进阶#xff1a;过滤、排序与聚合 - 手把手带你从基础查询到实战分析学习开场#xff1a;为什么你的查询代码又长又难维护#xff1f;环境准备#xff1a;搭建你的…SQLAlchemy查询进阶过滤、排序与聚合 - 手把手带你从基础查询到实战分析文章目录SQLAlchemy查询进阶过滤、排序与聚合 - 手把手带你从基础查询到实战分析学习开场为什么你的查询代码又长又难维护环境准备搭建你的实战演练场1. 安装必要的包2. 创建测试数据库基础概念SQLAlchemy查询的核心三要素1. 查询对象Query Object2. 延迟执行Lazy Loading3. 链式调用Method Chaining实战演练一过滤查询 - 精准找到你要的数据场景找出所有VIP用户过滤条件的多种写法对比复杂过滤实战多条件组合查询实战演练二排序与分页 - 让数据有序呈现场景用户消费排行榜实战演练三聚合查询 - 数据统计与分析基础聚合函数关联查询的聚合统计应用场景电商数据分析报表性能优化与避坑指南常见性能问题及解决方案优化示例解决N1查询问题调试技巧查看生成的SQL学习总结你的查询技能升级路线图✅ 已掌握的技能 下一步学习建议学习交流与进阶刚开始用SQLAlchemy时你是不是也只会用session.query(User).all()当产品经理说“按注册时间倒序只显示VIP用户还要统计每个月的注册人数”时是不是瞬间头大别慌今天我就带你搞定SQLAlchemy的查询三剑客过滤、排序与聚合。学习开场为什么你的查询代码又长又难维护我刚开始用SQLAlchemy时也踩过不少坑。记得有一次产品要一个用户分析报表我写了200多行的查询代码各种if-else判断最后自己都看不懂了。后来才发现SQLAlchemy的查询API设计得非常优雅只是我没掌握正确的方法。这篇文章能帮你解决什么告别手写复杂SQL字符串拼接用Pythonic的方式构建查询掌握过滤条件的多种写法从简单到复杂一网打尽学会排序、分页、聚合统计轻松应对各种报表需求理解查询背后的执行原理写出高性能的数据库操作代码环境准备搭建你的实战演练场1. 安装必要的包# 基础包pipinstallsqlalchemy1.4.46 pipinstallpymysql1.0.2# 可选用于数据展示pipinstallpandas pipinstalltabulate2. 创建测试数据库-- 在MySQL中执行CREATEDATABASEIFNOTEXISTSecommerce_db;USEecommerce_db;-- 用户表CREATETABLEusers(idINTPRIMARYKEYAUTO_INCREMENT,usernameVARCHAR(50)NOTNULLUNIQUE,emailVARCHAR(100)NOTNULLUNIQUE,ageINT,is_vipBOOLEANDEFAULTFALSE,registration_dateDATENOTNULL,total_spentDECIMAL(10,2)DEFAULT0.00,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);-- 订单表CREATETABLEorders(idINTPRIMARYKEYAUTO_INCREMENT,user_idINTNOTNULL,order_noVARCHAR(50)NOTNULLUNIQUE,amountDECIMAL(10,2)NOTNULL,statusENUM(pending,paid,shipped,delivered,cancelled)DEFAULTpending,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,FOREIGNKEY(user_id)REFERENCESusers(id)ONDELETECASCADE);-- 插入测试数据INSERTINTOusers(username,email,age,is_vip,registration_date,total_spent)VALUES(张三,zhangsanexample.com,25,TRUE,2023-01-15,1500.00),(李四,lisiexample.com,30,FALSE,2023-02-20,800.00),(王五,wangwuexample.com,22,TRUE,2023-03-10,2500.00),(赵六,zhaoliuexample.com,35,FALSE,2023-01-25,300.00),(钱七,qianqiexample.com,28,TRUE,2023-04-05,4200.00);INSERTINTOorders(user_id,order_no,amount,status)VALUES(1,ORD20230115001,500.00,delivered),(1,ORD20230220001,1000.00,shipped),(2,ORD20230221001,800.00,paid),(3,ORD20230310001,1500.00,delivered),(3,ORD20230315001,1000.00,delivered),(4,ORD20230130001,300.00,cancelled),(5,ORD20230405001,2000.00,shipped),(5,ORD20230410001,2200.00,pending);基础概念SQLAlchemy查询的核心三要素在深入实战前我们先理解三个核心概念1. 查询对象Query ObjectSQLAlchemy的查询不是立即执行的而是构建一个查询对象。这就像点菜时先写菜单最后才交给厨房。2. 延迟执行Lazy Loading查询只有在真正需要数据时才会执行这避免了不必要的数据库访问。3. 链式调用Method ChainingSQLAlchemy的查询方法可以像链条一样连接起来让代码更清晰。实战演练一过滤查询 - 精准找到你要的数据场景找出所有VIP用户fromsqlalchemyimportcreate_engine,Column,Integer,String,Boolean,Date,DECIMAL,TIMESTAMP,Enum,ForeignKeyfromsqlalchemy.ext.declarativeimportdeclarative_basefromsqlalchemy.ormimportsessionmaker,relationshipfromdatetimeimportdate# 创建引擎和会话enginecreate_engine(mysqlpymysql://root:passwordlocalhost:3306/ecommerce_db)Sessionsessionmaker(bindengine)sessionSession()Basedeclarative_base()# 定义模型classUser(Base):__tablename__usersidColumn(Integer,primary_keyTrue)usernameColumn(String(50),nullableFalse,uniqueTrue)emailColumn(String(100),nullableFalse,uniqueTrue)ageColumn(Integer)is_vipColumn(Boolean,defaultFalse)registration_dateColumn(Date,nullableFalse)total_spentColumn(DECIMAL(10,2),default0.00)created_atColumn(TIMESTAMP,defaultCURRENT_TIMESTAMP)# 定义关系ordersrelationship(Order,back_populatesuser)def__repr__(self):returnfUser(username{self.username}, email{self.email})classOrder(Base):__tablename__ordersidColumn(Integer,primary_keyTrue)user_idColumn(Integer,ForeignKey(users.id),nullableFalse)order_noColumn(String(50),nullableFalse,uniqueTrue)amountColumn(DECIMAL(10,2),nullableFalse)statusColumn(Enum(pending,paid,shipped,delivered,cancelled),defaultpending)created_atColumn(TIMESTAMP,defaultCURRENT_TIMESTAMP)# 定义关系userrelationship(User,back_populatesorders)def__repr__(self):returnfOrder(order_no{self.order_no}, amount{self.amount})# 方法1使用filter_by简单相等条件defget_vip_users_simple():获取所有VIP用户 - 简单版vip_userssession.query(User).filter_by(is_vipTrue).all()print(VIP用户简单版)foruserinvip_users:print(f -{user.username}({user.email}))returnvip_users# 方法2使用filter更灵活的条件defget_vip_users_filter():获取所有VIP用户 - 使用filtervip_userssession.query(User).filter(User.is_vipTrue).all()print(\nVIP用户使用filter)foruserinvip_users:print(f -{user.username})returnvip_users# 测试运行if__name____main__:get_vip_users_simple()get_vip_users_filter()过滤条件的多种写法对比场景filter_by写法filter写法说明相等条件filter_by(is_vipTrue)filter(User.is_vip True)filter_by更简洁不等条件不支持filter(User.age ! 25)必须用filter大于小于不支持filter(User.age 25)必须用filter多条件与filter_by(is_vipTrue, age25)filter(User.is_vipTrue, User.age25)都支持或条件不支持filter(or_(User.age25, User.age30))需要导入or_模糊查询不支持filter(User.username.like(张%))必须用filter复杂过滤实战多条件组合查询fromsqlalchemyimportand_,or_,not_defcomplex_filter_example():复杂过滤条件示例fromdatetimeimportdate# 场景找出年龄在25-30岁之间或者是VIP的用户querysession.query(User).filter(or_(and_(User.age25,User.age30),User.is_vipTrue))print(复杂查询结果)foruserinquery.all():print(f -{user.username}, 年龄:{user.age}, VIP:{user.is_vip})# 场景找出2023年第一季度注册的非VIP用户q1_startdate(2023,1,1)q1_enddate(2023,3,31)q1_userssession.query(User).filter(and_(User.registration_date.between(q1_start,q1_end),User.is_vipFalse)).all()print(\n2023年Q1注册的非VIP用户)foruserinq1_users:print(f -{user.username}, 注册日期:{user.registration_date})returnquery.all()# 运行复杂查询complex_filter_example()实战演练二排序与分页 - 让数据有序呈现场景用户消费排行榜defuser_spending_ranking():用户消费金额排序# 按消费金额降序排列users_by_spendingsession.query(User).order_by(User.total_spent.desc()).all()print(用户消费排行榜)print(-*50)print(f{排名:5}{用户名:10}{消费金额:10}{VIP:5})print(-*50)fori,userinenumerate(users_by_spending,1):vip_status是ifuser.is_vipelse否print(f{i:5}{user.username:10}¥{user.total_spent:8}{vip_status:5})returnusers_by_spendingdefmulti_column_sort():多列排序先按VIP状态再按消费金额# VIP用户在前然后按消费金额降序users_sortedsession.query(User).order_by(User.is_vip.desc(),# VIP在前True FalseUser.total_spent.desc()).all()print(\n多列排序VIP优先 消费降序)foruserinusers_sorted:vipVIPifuser.is_vipelse普通print(f -{vip}用户{user.username}: ¥{user.total_spent})returnusers_sorteddefpagination_example(page1,page_size2):分页查询示例# 计算偏移量offset(page-1)*page_size# 分页查询paginated_userssession.query(User)\.order_by(User.id)\.offset(offset)\.limit(page_size)\.all()# 获取总数用于计算总页数total_countsession.query(User).count()total_pages(total_countpage_size-1)//page_sizeprint(f\n分页查询第{page}页每页{page_size}条)print(f总记录数:{total_count}, 总页数:{total_pages})foruserinpaginated_users:print(f -{user.username}(ID:{user.id}))returnpaginated_users,total_count,total_pages# 运行排序和分页示例user_spending_ranking()multi_column_sort()pagination_example(1,2)pagination_example(2,2)实战演练三聚合查询 - 数据统计与分析基础聚合函数fromsqlalchemyimportfunc,descdefbasic_aggregation():基础聚合统计# 1. 统计用户总数total_userssession.query(func.count(User.id)).scalar()print(f用户总数:{total_users})# 2. 统计VIP用户数vip_countsession.query(func.count(User.id)).filter(User.is_vipTrue).scalar()print(fVIP用户数:{vip_count})# 3. 平均年龄avg_agesession.query(func.avg(User.age)).scalar()print(f平均年龄:{avg_age:.1f}岁)# 4. 总消费金额total_spent_allsession.query(func.sum(User.total_spent)).scalar()print(f总消费金额: ¥{total_spent_all:.2f})# 5. 最大/最小年龄max_agesession.query(func.max(User.age)).scalar()min_agesession.query(func.min(User.age)).scalar()print(f年龄范围:{min_age}-{max_age}岁)return{total_users:total_users,vip_count:vip_count,avg_age:avg_age,total_spent:total_spent_all}defgroup_by_example():分组统计示例# 按VIP状态分组统计vip_statssession.query(User.is_vip,func.count(User.id).label(user_count),func.avg(User.age).label(avg_age),func.sum(User.total_spent).label(total_spent)).group_by(User.is_vip).all()print(\n按VIP状态分组统计)print(-*60)print(f{VIP状态:10}{用户数:8}{平均年龄:10}{总消费:12})print(-*60)foris_vip,count,avg_age,total_spentinvip_stats:vip_statusVIP用户ifis_vipelse普通用户print(f{vip_status:10}{count:8}{avg_age:10.1f}¥{total_spent:10.2f})# 按月统计注册用户数monthly_regsession.query(func.date_format(User.registration_date,%Y-%m).label(month),func.count(User.id).label(new_users)).group_by(month).order_by(month).all()print(\n月度注册用户统计)formonth,countinmonthly_reg:print(f{month}:{count}人)returnvip_stats,monthly_regdefhaving_example():HAVING子句示例筛选分组结果# 找出平均消费金额超过1000的用户年龄段age_group_statssession.query(User.age,func.count(User.id).label(user_count),func.avg(User.total_spent).label(avg_spent)).group_by(User.age).having(func.avg(User.total_spent)1000).all()print(\n平均消费超过1000元的年龄段)forage,count,avg_spentinage_group_stats:print(f 年龄{age}岁:{count}人平均消费¥{avg_spent:.2f})returnage_group_stats# 运行聚合查询basic_aggregation()group_by_example()having_example()关联查询的聚合统计defjoin_aggregation():关联表的聚合统计# 统计每个用户的订单数量和总金额user_order_statssession.query(User.username,func.count(Order.id).label(order_count),func.sum(Order.amount).label(total_order_amount),func.avg(Order.amount).label(avg_order_amount)).join(Order,User.idOrder.user_id)\.group_by(User.id)\.order_by(desc(total_order_amount)).all()print(\n用户订单统计)print(-*70)print(f{用户名:10}{订单数:8}{订单总额:12}{平均订单额:12})print(-*70)forusername,count,total,avginuser_order_stats:print(f{username:10}{count:8}¥{total:10.2f}¥{avg:10.2f})# 统计订单状态分布order_status_statssession.query(Order.status,func.count(Order.id).label(count),func.sum(Order.amount).label(total_amount)).group_by(Order.status).all()print(\n订单状态分布)forstatus,count,amountinorder_status_stats:print(f{status}:{count}单总金额¥{amount:.2f})returnuser_order_stats,order_status_stats# 运行关联聚合查询join_aggregation()应用场景电商数据分析报表让我们把这些技术组合起来实现一个真实的电商数据分析报表defecommerce_analysis_report():电商数据分析报表print(*60)print(电商数据分析报表)print(*60)# 1. 核心指标概览print(\n1. 核心指标概览)print(-*40)total_userssession.query(func.count(User.id)).scalar()total_orderssession.query(func.count(Order.id)).scalar()total_gmvsession.query(func.sum(Order.amount)).scalar()or0avg_order_valuetotal_gmv/total_ordersiftotal_orders0else0print(f总用户数:{total_users}人)print(f总订单数:{total_orders}单)print(f总交易额(GMV): ¥{total_gmv:.2f})print(f客单价: ¥{avg_order_value:.2f})# 2. 用户分层分析print(\n2. 用户分层分析)print(-*40)user_tierssession.query(func.floor(User.total_spent/1000).label(tier),func.count(User.id).label(user_count),func.sum(User.total_spent).label(total_spent)).group_by(tier).order_by(tier).all()fortier,count,spentinuser_tiers:tier_rangef¥{tier*1000}-{(tier1)*1000-1}iftier4:tier_rangef¥{tier*1000}print(f{tier_range}:{count}人消费¥{spent:.2f})# 3. 月度趋势分析print(\n3. 月度趋势分析)print(-*40)monthly_trendsession.query(func.date_format(Order.created_at,%Y-%m).label(month),func.count(Order.id).label(order_count),func.sum(Order.amount).label(gmv),func.count(func.distinct(Order.user_id)).label(active_users)).group_by(month).order_by(month).all()formonth,orders,gmv,usersinmonthly_trend:print(f{month}:{orders}单GMV¥{gmv:.2f}活跃用户{users}人)# 4. VIP用户价值分析print(\n4. VIP用户价值分析)print(-*40)vip_valuesession.query(User.is_vip,func.count(User.id).label(user_count),func.avg(User.total_spent).label(avg_spent),func.avg(session.query(func.count(Order.id)).filter(Order.user_idUser.id).scalar_subquery()).label(avg_orders)).group_by(User.is_vip).all()foris_vip,count,avg_spent,avg_ordersinvip_value:user_typeVIP用户ifis_vipelse普通用户print(f{user_type}:{count}人人均消费¥{avg_spent:.2f}人均{avg_orders:.1f}单)return{total_users:total_users,total_orders:total_orders,total_gmv:total_gmv,monthly_trend:monthly_trend}# 生成完整报表report_dataecommerce_analysis_report()性能优化与避坑指南常见性能问题及解决方案问题现象可能原因解决方案性能提升N1查询问题循环中查询关联数据使用joinedload()或subqueryload()10-100倍查询返回大量数据没有分页一次性加载所有数据使用limit()和offset()分页视数据量而定频繁的count查询每次分页都执行count缓存count结果或使用近似值2-5倍复杂的聚合查询慢没有合适的索引为分组和过滤字段添加索引10-100倍内存占用过高加载了不需要的列使用with_entities()只选择需要的列30-70%优化示例解决N1查询问题fromsqlalchemy.ormimportjoinedloaddefoptimized_user_orders():优化版一次性加载用户及其订单# 错误做法N1查询print(错误做法N1查询)userssession.query(User).limit(3).all()foruserinusers:orderssession.query(Order).filter(Order.user_iduser.id).all()# 每次循环都查询print(f{user.username}有{len(orders)}个订单)# 正确做法使用joinedloadprint(\n正确做法使用joinedload)users_with_orderssession.query(User)\.options(joinedload(User.orders))\.limit(3).all()foruserinusers_with_orders:print(f{user.username}有{len(user.orders)}个订单)returnusers_with_orders# 运行优化示例optimized_user_orders()调试技巧查看生成的SQLdefdebug_sql_generation():调试查看SQLAlchemy生成的SQLfromsqlalchemy.dialectsimportmysql# 构建一个复杂查询querysession.query(User.username,func.count(Order.id).label(order_count)).join(Order)\.group_by(User.id)\.having(func.count(Order.id)1)# 查看生成的SQL不执行sql_statementquery.statementcompiled_sqlstr(sql_statement.compile(dialectmysql.dialect(),compile_kwargs{literal_binds:True}))print(生成的SQL语句)print(-*80)print(compiled_sql)print(-*80)returncompiled_sql# 查看SQLdebug_sql_generation()学习总结你的查询技能升级路线图通过今天的学习你已经掌握了SQLAlchemy查询的三大核心技能✅ 已掌握的技能精准过滤使用filter()和filter_by()精确筛选数据灵活排序单列、多列排序支持升序降序智能分页limit()和offset()实现数据分页强大聚合count()、sum()、avg()等聚合函数分组统计group_by()和having()实现数据分组分析 下一步学习建议高级关联查询学习subquery()、cte()公共表表达式查询性能优化深入理解执行计划学习索引优化异步查询掌握SQLAlchemy 2.0的异步API复杂报表学习窗口函数、递归查询等高级特性学习交流与进阶恭喜你完成了SQLAlchemy查询进阶的学习现在你已经能够处理大多数业务场景的数据查询需求了。欢迎在评论区分享你在实际项目中遇到过哪些复杂的查询需求文中的哪个示例对你帮助最大在优化查询性能时你有哪些独门秘籍我会认真阅读每一条留言并为初学者提供针对性的解答。记住数据库查询就像学游泳光看教程不行一定要多写多练推荐学习资源SQLAlchemy官方文档 - 最权威的参考资料特别是ORM查询部分《Python数据库编程实战》 - 系统学习Python操作各种数据库SQLZoo - 在线练习SQL语句打好SQL基础GitHub上的SQLAlchemy示例项目 - 查看真实项目中的最佳实践下篇预告下一篇将分享《SQLAlchemy高级关联查询从一对一关系到多对多复杂查询》带你掌握一对一、一对多、多对多关系的定义与查询关联查询的性能优化技巧自关联查询的实现方法使用关联查询构建复杂业务报表最后的小建议学习数据库查询就像学习一门新语言开始可能会觉得语法复杂但一旦掌握就能优雅地表达各种数据需求。今天学的内容建议你明天就在自己的项目中用起来遇到问题再回来查阅这样学习效果最好。记住我的经验之谈我刚开始时总想一次性掌握所有高级特性结果基础不牢。后来发现先把过滤、排序、聚合这三大件练熟80%的查询需求都能搞定。剩下的20%等真正需要时再学也不迟。祝你查询愉快代码无bug
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

中国网站建设中心龙岗网站建设流程

📝 博客主页:Jax的CSDN主页 目录AI医生的逆袭之路:从“智障”到“神助攻” 一、AI医生的“成长日记”:从背锅侠到救场王 二、当AI遇上“看病难”:那些改变游戏规则的瞬间 三、AI医生的“人格分裂”:既要靠谱…

张小明 2025/12/22 14:42:13 网站建设

专业做网站排名公司电话安徽建设工程信息网查询

文章目录前言1. 安装Docker2. 本地部署HivisionIDPhotos3. 公网远程访问制作照片3.1 内网穿透工具安装3.2 创建远程连接公网地址4. 配置固定公网地址前言 HivisionIDPhotos 是一款 AI 证件照制作工具,能自动抠图、调整尺寸和背景,生成符合各种规格的证件…

张小明 2025/12/22 14:41:12 网站建设

重庆做网站做网站用的主机

前言 本个人理财系统管理员功能有个人中心,用户管理,账单类型管理。用户功能有个人中心,收入账单管理,支出账单管理,理财计划管理,统计分析管理,备忘录管理等。因而具有一定的实用性。 本站是一…

张小明 2025/12/22 14:39:10 网站建设

做网站要注意什么电子商务网站建设作业代码

AI Agent是将大模型与工具、记忆、执行系统结合的智能体,具有自主决策、持续学习、多模态交互、工具集成和多智能体协作五大特征。其技术架构包含感知、决策、执行、记忆和反馈优化六大模块。AI Agent改变了从"告诉机器怎么做"到"告诉机器想要什么&q…

张小明 2025/12/22 14:38:09 网站建设

网站备案后 还是需要再备案吗网站建设企业号助手

破解负载不均难题-多 Agent 系统的复杂度感知调度方案 一、背景与问题引入 随着 多 Agent 系统(Multi-Agent System, MAS) 在智能体协作、自动化运维、智能搜索、LLM Agent 编排等场景中的广泛应用,系统规模迅速扩大,一个现实问题…

张小明 2025/12/22 14:37:09 网站建设

义乌公司网站建设asp网站安全吗

当别人还在用ChatGPT闲聊时,懂行的人已经用它改写了职业轨迹。 深夜,一位从事传统软件开发的工程师小李,在调试完最后一个API接口后,习惯性地点开了GitHub Trending。排行榜前列,与大模型相关的开源项目几乎占据了半壁…

张小明 2025/12/22 14:36:08 网站建设