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

MySQLX Python执行查询时SELECT被替换为AS?求排查原因

问题:MySQLX Python执行查询时SELECT被替换为AS触发语法错误

问题详情

使用mysql-connector-python的MySQLX API执行查询时触发SQL语法错误,错误显示语句中的SELECT被替换为AS。调用查询对象的.get_sql()方法时生成的语句正常,但调用.execute()时语句被篡改。

代码示例

报错的查询代码

def queryOrg(self, OrgID):
        session = mysqlx.get_session(
            {'host': db.HOST, 'port': db.PORT, 'user': db.USER, 'password': db.PASSWORD})
        org_schema = session.get_schema('Organizations')
        org_table = org_schema.get_table('Organizations')
        result = org_table.select(["*"]).where('Organization_ID = ' + str(OrgID)).execute()
        print(result)

查看生成SQL的代码

def queryOrg(self, OrgID):
        session = mysqlx.get_session(
            {'host': db.HOST, 'port': db.PORT, 'user': db.USER, 'password': db.PASSWORD})
        org_schema = session.get_schema('Organizations')
        org_table = org_schema.get_table('Organizations')
        result = org_table.select(["*"]).where('Organization_ID = ' + str(OrgID)).get_sql()
        print(result)

错误信息

mysqlx.errors.OperationalError: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS `*` FROM `Organizations`.`Organizations` WHERE (`Organization_ID` = 2)' at line 1

排查发现

  • .get_sql()输出的SQL语句正常:SELECT * FROM Organizations.Organizations WHERE Organization_ID = 2
  • .execute()执行时生成错误语句:AS *FROMOrganizations.Organizations WHERE (Organization_ID = 2)

解决方案

1. 升级mysql-connector-python版本

该问题是mysql-connector-python 8.0.30的已知bug,在8.0.31及以上版本中已修复。执行以下命令升级:

pip install --upgrade mysql-connector-python

2. 临时替代方案(无需升级)

将select(["*"])中的列表参数改为字符串参数select("*"),修改后的代码:

def queryOrg(self, OrgID):
        session = mysqlx.get_session(
            {'host': db.HOST, 'port': db.PORT, 'user': db.USER, 'password': db.PASSWORD})
        org_schema = session.get_schema('Organizations')
        org_table = org_schema.get_table('Organizations')
        # 替换列表["*"]为字符串"*"
        result = org_table.select("*").where('Organization_ID = ?', OrgID).execute()
        print(result)

额外建议

避免直接拼接SQL参数('Organization_ID = ' + str(OrgID)),存在SQL注入风险,改用参数绑定.where('Organization_ID = ?', OrgID),如上述代码所示。

环境信息

  • 系统:Ubuntu树莓派
  • MySQL版本:8.0.31-0ubuntu0.22.04.1
  • Python版本:3.8.10
  • mysql-connector-python版本:8.0.30
  • Flask版本:2.2.2

内容的提问来源于stack exchange,提问作者Nathaniel Reeves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:55:20