Python使用PyMySQL查询股票多周期历史价格及格式化问题
优化实现代码
import datetime import pymysql # 初始化数据库连接 db = pymysql.connect(host='localhost', user='Test', password='TestPassword', database='dbInvest') # 目标查询日期变量 varrDate2 = datetime.datetime.now().strftime("%Y-%m-%d") # 股票ID也可提取为变量灵活修改 var_stock_id = 7 try: with db.cursor(pymysql.cursors.DictCursor) as cursor: # 1. 使用参数化查询占位符替换硬编码内容 sqllookup = """ SELECT rPrice FROM tblHistory WHERE rStockID = %s AND rDate >= DATE_ADD(%s, INTERVAL -7 DAY) ORDER BY ABS(DATEDIFF(rDate, %s)) ASC LIMIT 1 """ # 按顺序传入参数,pymysql会自动处理类型转义,同时避免SQL注入风险 cursor.execute(sqllookup, (var_stock_id, varrDate2, varrDate2)) result = cursor.fetchone() if result: # 2. 直接从字典结构中取字段值,Decimal类型可直接输出 price = result['rPrice'] # 如需后续数值计算可转float:float(price),直接打印则输出纯数值 print(f"1 Week Value is {price}") else: print("未查询到对应价格数据") finally: db.close()
问题解决说明
- 替换SQL硬编码日期:放弃字符串拼接SQL的方式,使用pymysql原生参数化查询能力,用
%s作为参数占位符,执行语句时按顺序传入变量即可,不需要手动处理日期格式转义。另外优化了排序逻辑,用ABS(DATEDIFF(rDate, %s))取与目标日期间隔最小的记录,比单纯按日期升序取的结果更贴合「最近邻近记录」的需求。 - 提取纯数值输出:DictCursor返回的结果是字典结构,直接通过字段名取出对应值即可,返回的Decimal类型是MySQL数值类型的精确映射,不需要做字符串拆分替换,直接打印就会输出
86.7400的效果,如果需要参与后续数值计算,直接转为float类型即可。
注:如果实际表中价格字段为你输出示例里的
ClosePrice,而非描述里的rPrice,把代码中对应的字段名替换即可。
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

