如何将数据库查询得到的最大日期作为参数用于其他SQL查询
问题原因与解决方法
核心问题点
- Python侧定义的变量
d不能直接写入SQL语句字符串:数据库引擎仅能解析SQL语法,无法识别Python上下文的变量,会把d识别为anothertable的字段,因此抛出字段不存在的错误。 - 结果取值不完整:
cursor.fetchone()返回的是单行结果组成的元组,即使查询仅返回一个字段,也需要通过下标提取才能得到实际的日期对象,你当前的d实际是(datetime.date(2021, 9, 8),)格式的元组,不是直接可用的日期值。 - 代码笔误:你写的
cursor.fethcone()拼写错误,正确写法为cursor.fetchone()。
正确实现方案
使用数据库驱动支持的参数化查询传递变量,不要直接把变量拼入SQL字符串,既可以避免语法错误,也能防范SQL注入风险,示例代码如下:
第一步:提取最大日期
query = """ select cast(max(order_date) as date) from tablename """ cursor.execute(query) # 取返回元组的第一个元素,得到实际的datetime.date对象 max_order_date = cursor.fetchone()[0]
第二步:执行带参数的查询
绝大多数数据库驱动的execute方法支持传入参数元组,用%s作为占位符(SQLite用?作为占位符,可根据你使用的数据库类型调整):
query3 = """ select * from anothertable where order_date = %s limit 10 """ # 参数必须放在元组中,即使只有一个参数也要加逗号保持元组格式 cursor.execute(query3, (max_order_date,))
内容的提问来源于stack exchange,提问作者merchmallow
相关产品推荐
相关产品推荐

