Python操作MySQL参数化传表名被加引号致表不存在报错如何解决
问题原因
mysql.connector的参数化查询功能,设计上仅支持对插入/查询的值做自动转义处理,表名、字段名这类属于SQL标识符,不能通过参数化的方式传递。
你把表名放到cursor.execute()的第二个参数元组里时,连接器会把它当成普通字符串值,自动加上单引号转义,再结合你SQL模板里已经写的反引号,最终生成的SQL表名部分变成了`'aud-cad_30mins'`,等于表名被同时包裹了反引号和单引号,MySQL会把带单引号的整个串识别为表名,自然匹配不到实际存在的aud-cad_30mins表。
另外你代码里的值占位符也错误加了反引号,反引号仅用于包裹标识符,值的占位符不需要加任何引号,参数化会自动处理转义。
解决方法
表名提前用字符串格式化拼入SQL语句,同时必须加合法性校验避免SQL注入风险,插入的值依旧保留参数化传递,保证数据转义安全。
修正后的代码如下:
import mysql.connector def add_features_to_db(stockname, timeframe, date, feature): # 表名校验,限制仅允许合法字符,避免SQL注入风险 allowed_chars = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_') dbtable = stockname + timeframe if not all(c in allowed_chars for c in dbtable): raise ValueError("表名包含非法字符") try: conn = mysql.connector.connect( user='root', password='', host='localhost', database='fx003') cursor = conn.cursor() # 表名提前格式化拼入,值保留参数化占位符 mySql_insert_query = f"""INSERT INTO `{dbtable}` (date, trend) VALUES (%s, %s)""" # 仅传递值参数 record = (date, feature) cursor.execute(mySql_insert_query, record) conn.commit() print("Record inserted successfully") except mysql.connector.Error as error: print("Failed to insert into MySQL table {}".format(error)) finally: # 增加conn变量存在性判断,避免连接创建失败时触发NameError if 'conn' in locals() and conn.is_connected(): cursor.close() conn.close() print("MySQL connection is closed") add_features_to_db("aud-cad", "_30mins", "2021-09-24 21:00:00", "Short")
内容的提问来源于stack exchange,提问作者saltuklev
相关产品推荐
相关产品推荐

