python - MYSQL参数python问题与表名
问题描述
我是使用 python API 向 mysql 发送查询的新手。
我的问题很容易重现。我有一个名为“ingredient”的表,我想使用参数从 python 中选择行
如果我这样做,cursor.execute("select * from ?",('ingredient',))
我会收到错误消息:Error while connecting to MySQL Not all parameters were used in the SQL statement MySQL connection is closed
我cursor.execute("select * from ?",'ingredient')
是否收到错误消息:Error while connecting to MySQL 1064 (42000): 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 '?' at line 1
使用 %s 而不是 ? 的问题相同。在 'ingredient' 上使用其他类型的单引号而不是 'ingredient' 也不会产生结果。
这应该如何在这里工作?
解决方案
您只是不能将表名作为参数传递给查询。参数化机制用于传递文字值,而不是对象名称。请记住,数据库必须能够仅从参数化字符串(没有实际参数值)准备查询计划,这不符合使用元数据作为参数的资格。
您需要字符串连接:
cursor.execute("select * from " + yourvar);
请注意,如果变量来自您的程序外部,则使用此类结构会将您的代码暴露给 SQL 注入。您需要在执行查询之前手动验证参数的值(例如,根据允许值的固定列表检查它,或者通过查询数据库的信息模式以确保表确实存在)。
推荐阅读
- java - Ant 媒体服务器:线程“主”java.lang.UnsupportedClassVersionError 中的异常
- css - 有没有办法从另一个父文件夹 css react js 导入文件
- big-o - 如何使用 Big-O 的正式定义证明 y = n^2 不属于 O(1)?
- docker - 调整 docker swarm 模式的负载均衡器
- google-sheets - 从 Apps Script google 表格调用 BigQuery 在 BigQuery 中保存的查询
- ios - Stripe 客户端意图错误迅速:没有这样的 payment_intent
- java - 按多个字段分组的流:,管理地图嵌套地图的输出
- flutter - Flutter 中的 ReorderableListview 中无法访问 ReorderableListview.builder 和无物理属性
- c# - 创建类实例时如何将值硬编码到属性变量?
- python - 读取具有两个或多个分隔符的 csv 文件时出现解析错误