You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:36:03