Python中MySQL查询使用时间戳变量报错,求解决方案
解决Python中MySQL查询使用时间戳变量的问题
你的问题很典型——直接把Python变量名写进SQL字符串里,MySQL会把它当成表的列名,而不是你要传入的数值,这就是为什么会报Unknown column 'tsmin' in 'where clause'错误。下面给你两种解决办法,优先推荐第一种:
1. 使用参数化查询(推荐,安全且规范)
这是操作数据库时传递变量的标准方式,既能解决变量传递问题,还能防止SQL注入攻击。不同的MySQL Python驱动(比如MySQLdb、pymysql)通常用%s作为参数占位符,执行时把变量作为第二个参数传给cursor.execute():
tsmin = 1527573750 tsmax = 1527574050 # 用%s作为占位符,不要加引号 command = "SELECT * FROM #CMD# WHERE data.#CMD#.TimesTamp BETWEEN FROM_UNIXTIME(%s) AND FROM_UNIXTIME(%s)" # 执行时传入变量元组 cursor.execute(command, (tsmin, tsmax))
驱动会自动帮你处理变量的类型转换和字符串转义,完全不用手动拼接字符串。
2. 字符串格式化(不推荐,有SQL注入风险)
如果只是测试场景,或者确定变量是安全的(比如不是用户输入),可以用Python的字符串格式化把变量值直接替换进SQL语句:
方法一:f-string(Python 3.6+)
tsmin = 1527573750 tsmax = 1527574050 command = f"SELECT * FROM #CMD# WHERE data.#CMD#.TimesTamp BETWEEN FROM_UNIXTIME({tsmin}) AND FROM_UNIXTIME({tsmax})"
方法二:str.format()
tsmin = 1527573750 tsmax = 1527574050 command = "SELECT * FROM #CMD# WHERE data.#CMD#.TimesTamp BETWEEN FROM_UNIXTIME({0}) AND FROM_UNIXTIME({1})".format(tsmin, tsmax)
⚠️ 注意:这种方法绝对不要用于处理用户输入的变量,恶意用户可以通过构造特殊值来执行任意SQL语句(SQL注入),导致数据泄露或破坏。
内容的提问来源于stack exchange,提问作者JensVDH
相关产品推荐
相关产品推荐

