flask sqlalchemy 根据日期查询数据库记录

本文分享了在Flask-SQLAlchemy环境下,利用ORM模式进行日期查询的三种方法,包括填充datetime比较、使用SQLCAST函数及SQLEXTRACT函数,详细解析了每种方法的实现过程及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用flask-sqlalchemy以orm模式根据日期查询数据库记录,看似很简单,也很平常的操作呀,硬是搞死我了,花了两个小时才搞定,囧ORZ

我数据库mytable中有一个datetime类型字段create_date,然后我们需要查询今天的数据记录,正常我们sql语句来做这个事,非常简单,地球人都知道,用DATE()嘛:

select * from mytable where DATE(create_date) == CURDATE()

然鹅,我们flask-sqlalchemy的orm模式呢:ormModel.query.filter(“xxxx”)
这里面的xxx怎么写,我真是绕了几个弯才出来:

方案1 填充datetime后再丢进去比较

这个方案中我的实际需求是我需要根据起止日期查询数据库记录

# 先传参进来string类型的起、止日期,然后直接丢进查询语句里面
mintime = mindate + ' ' + '0:0:0'
maxtime = maxdate + ' ' + '23:59:59'
record_list = RecordModel.query.filter(RecordModel.reporttime >= mintime).filter(
                    RecordModel.reporttime <= maxtime).order_by(RecordModel.reporttime.desc()).all()

这个方法感觉太low了!

方案2 使用SQL CAST函数

这个方案中我直接查询今日的数据,使用cast函数可以获取datetime字段的date部分,激动!
先看CAST函数介绍:CAST (expression AS data_type)
参数说明:
expression:任何有效的SQServer表达式。
AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。
data_type:目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。
用CAST函数进行数据类型转换时,在下列情况下能够被接受:
(1)两个表达式的数据类型完全相同。
(2)两个表达式可隐性转换
(3)必须显式转换数据类型

好!我们试下:

# 先导入sql db对象
records = RecordModel.query.filter(db.cast(RecordModel.reporttime, db.DATE) == db.cast(datetime.datetime.now(), db.DATE)).all()

查询成功,完美!

方案3 使用SQL EXTRACT函数

这个方案是网上查的,把年、月、日单独拎出来去匹配,我没试过,供参考

# 查询2016年5月每天的数据
session.query(extract(‘day‘, User.create_date).label(‘day‘), func.count(*)).filter(extract(‘month‘, User.create_date) == 5, extract(‘year‘, User.create_date) == 2016).group_by(‘day‘).all()

走过的弯路+1,Mark!

分析:主要原因是初学框架,对orm里面查询条件哪些原生SQL语句、函数可以用,哪些用不了不熟悉,对sqlalchemy对象的属性也不甚了解

条件组合MySQL数据库密码是220603,我提供一个excel文档,我可以将这个文档进行导入到我的HTML页面里面的导入按钮,端口号为5008 导入功能:店铺管理(添加,修改,删除店铺的功能),通过输入店铺码和店铺名称来添加,添加完成之后会有一个进行导入店铺数据功能,这个就通过一个选择文件(如excel和csv),我认为在MySQL数据库里面创建表太麻烦了,只想创建一个数据库名字为shop_order,然后根据导入文件的第一行的所有表名字作为关键字创建所对应的MySQL表放在shop——oeder下面(如将Paid Time自动识别为DATETIME类型),切记这个关键字就是导入文档表的第一行,并且下面都是该关键字所对应的所有数据,由于我所做的系统需要导入三个文档,所以要设置三个导入数据的按钮,分别为All order,in come,creater order这三个表所对应了所有订单数据,收入订单数据和达人订单数据(也就是通过达人带货卖出去的订单)。 查询功能:在导入需要的数据之后,我们需要进行数据查询,目前先通过店铺码和店铺名称查询店铺,查询成功后进入店铺,这个时候我们需要再查询店铺的数据,这个时候就需要通过查询我们目前需要的数据,有最开始得到的关键字:Order ID,Paid Time(付款时间),还要给这个数据排列,也就是在这两个查询数据前面还需要建立一个Shop ID作为编号如01,02,03等等,查询后显示的完整数据的是[Shop ID:Order ID,Paid Time],实现上面功能还不够,我希望还可以增加一个时间查询也就是可以输入某个时间段到某个时间段来进行查询这段时间所有订单的数据,列如Start time[年月日]——End timr[年月日],这个时间查询是通过最开始得到的关键字里面的Paid Time所对应的时间数据("10/07/2025 10:24:31 " )来决定,因为不是每个订单号Order ID都会被进行付款(paid_time),我们只需要提前这个付款时间不需要其他时间,所以只需要查询有paid_time的Order ID并且提取出来即可,若没有paid_time数据就直接跳过放弃,继续查询有paid_time的数据订单即可,根据以上要求给出这个项目的开发教程,要求保姆级教程,再说一遍,在里面必须有可以导入excel和csv文档的功能,并且是点击导入数据就可以在我的电脑里面查找选择文档。要注意下面几个问题,第一:日期时间列识别问题:系统错误地将非日期列(如 Order_Status、Quantity)识别为日期列,日期转换失败率高(如 Created_Time 只有33.4%的转换成功率),错误提示:列 XXX 保持原样: 日期格式识别率低 (0.0%)原因是:仅通过列名关键词(如包含"time")判断是否为日期列,缺乏数据内容验证,未排除明确非日期列的字段(如状态、数量、金额等),未处理多种日期格式(如 10/07/2023 10:24:31 和 2023-07-10T15:45:00),一定要增强列识别逻辑,还有多格式日期解析和分阶段验证。 第二:数据类型推断错误:避免数值列(如 Quantity)被误识别为日期数据库插入时报错:Incorrect datetime value: '579567909575820736' for column 'Order ID',原因是因为类型推断仅基于列名,未结合数据内容,未处理大整数和特殊格式数字。所以要设置一个优先级调整和安全转换。 第三:数据库交互问题,特别是RuntimeError: The session is unavailable because no secret key was set,事务回滚失败导致表残留,数据类型不匹配(如DATETIME和VARCHAR冲突)原因是Flask会话密钥未配置未正确处理MySQL错误代码(如1292=日期格式错误)和表结构创建与数据插入逻辑分离。所以要做到基础配置和事务管理和原子性操作这三个方面。 第四:前端模板渲染问题: 问题表现: jinja2.exceptions.TemplateNotFound jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'id' JavaScript中 const report = {{ date_report|tojson|safe }} 报错 根本原因: 模板文件未放在正确目录(templates/),变量未定义或为None时直接调用方法,未处理JSON序列化中的None值,解决方案:设置目录结构规范和安全变量访问以及默认值处理。 第五: 文件上传与数据处理问题: 问题表现: 上传的Excel/CSV文件解析失败 临时文件未清理 列名含空格导致SQL错误 根本原因: 未验证文件内容格式 未处理文件编码问题(如UTF-8 vs GBK) 未规范化列名(如 Paid Time → Paid_Time) 解决方案:设置文件预处理和资源清理和编码指定。 第六:分页与性能问题: 问题表现: 大数据量查询时内存溢出 分页逻辑错误(LIMIT/OFFSET计算) 解决方案:设置流式查询和分页优化。 最后做一些优化比如:系统架构改进建议 日志监控: python代码: app.logger.addHandler(logging.FileHandler('import_errors.log')) 配置分离: python代码: class DevelopmentConfig(Config): DEBUG = True UPLOAD_FOLDER = '/tmp/uploads' 单元测试: python代码: def test_datetime_detection(): assert is_potential_datetime_column("Paid_Time", pd.Series(["2023-01-01"])) is True 根据上面所有要求和问题还有解决方法制定一个Python电商数据分析系统教程,要求保姆级教程!!!请仔细分析我给出的所有问题并且一一解决生成一个完整教程,要求准确并且代码质量高可以运行
最新发布
07-15
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值