如何在Python中将日期变量传入SQL查询语句
在Python中动态替换SQL查询的日期变量
下面几种简便方法可以实现你的需求,按场景选择即可:
1. f-string字符串插值(Python 3.6+ 最简洁)
直接在SQL字符串前加f,用{变量名}替换目标位置:
date_input = input("请输入日期(格式:YYYY-MM-DD): ") query_new_Limits = f""" SELECT ####### , a.RULE_NAME , a.RESULT_VALUE , a.SUMMARY_DETAIL , a.REF_DATE FROM ######## a ################### b ON b.T_PORTFOLIO_ID = a.PORTFOLIO_ID WHERE a.REF_DATE = TO_DATE('{date_input}','YYYY-MM-DD') AND REGEXP_LIKE(a.PORTFOLIO_CODE,'^[[:digit:]]+$') AND NOT b.POR_INVESTMENT_TYPE IN ####### AND b.REF_TO_DATE > TO_DATE('{date_input}','YYYY-MM-DD') AND a.RESULT_STATE_ID > 12 """
这种方式可读性极强,代码量最少,适合快速实现。
2. str.format()方法(兼容旧版本Python)
如果你的Python版本低于3.6,用format()填充占位符:
date_input = input("请输入日期(格式:YYYY-MM-DD): ") query_new_Limits = """ SELECT ####### , a.RULE_NAME , a.RESULT_VALUE , a.SUMMARY_DETAIL , a.REF_DATE FROM ######## a ################### b ON b.T_PORTFOLIO_ID = a.PORTFOLIO_ID WHERE a.REF_DATE = TO_DATE('{}','YYYY-MM-DD') AND REGEXP_LIKE(a.PORTFOLIO_CODE,'^[[:digit:]]+$') AND NOT b.POR_INVESTMENT_TYPE IN ####### AND b.REF_TO_DATE > TO_DATE('{}','YYYY-MM-DD') AND a.RESULT_STATE_ID > 12 """.format(date_input, date_input)
占位符{}会按顺序被format()的参数替换,这里两个位置用同一个变量,所以传两次。
3. 参数化查询(生产环境首选,防SQL注入)
如果要直接执行SQL,务必用参数化查询,避免安全风险,同时避免日期格式错误。以Oracle为例:
import cx_Oracle from datetime import datetime date_input = input("请输入日期(格式:YYYY-MM-DD): ") # 把输入的字符串转成datetime对象,确保类型正确 date_obj = datetime.strptime(date_input, '%Y-%m-%d') query_new_Limits = """ SELECT ####### , a.RULE_NAME , a.RESULT_VALUE , a.SUMMARY_DETAIL , a.REF_DATE FROM ######## a ################### b ON b.T_PORTFOLIO_ID = a.PORTFOLIO_ID WHERE a.REF_DATE = :ref_date AND REGEXP_LIKE(a.PORTFOLIO_CODE,'^[[:digit:]]+$') AND NOT b.POR_INVESTMENT_TYPE IN ####### AND b.REF_TO_DATE > :ref_date AND a.RESULT_STATE_ID > 12 """ # 连接数据库并执行查询 conn = cx_Oracle.connect("用户名/密码@数据库地址") cursor = conn.cursor() cursor.execute(query_new_Limits, ref_date=date_obj)
参数化查询由数据库处理变量的转义与类型转换,安全且可靠,是生产环境的标准做法。
内容的提问来源于stack exchange,提问作者Sebastian Damon B
相关产品推荐
相关产品推荐

