【问题标题】:Dynamic query in django with "|" character in WHERE clause and variable in tablename使用“|”在 django 中进行动态查询WHERE 子句中的字符和表名中的变量
【发布时间】:2019-07-08 17:05:30
【问题描述】:

我的views.py 中运行了一个动态sql 查询,并且已经运行了其他运行良好的查询。我不担心 sql 注入,因为这是一个私人网站。但是,我的 And 子句中的参数有字符“|”在其中引发错误:

Unknown column "X" in 'where clause'

我查看了解决方案,但它们都使用非动态查询,然后禁止我将表名设为变量。

这就是我想要的:

mycursor = mydb.cursor()
assembly_name = "peptides_proteins_000005"
group_id = 5
protein_id = "sp|P48740|MASP1_HUMAN"
qry = "SELECT * FROM %s WHERE group_id = %i AND protein_id = %s" % (assembly_name, group_id, protein_id)
mycursor.execute(qry)

但这会引发错误:

mysql.connector.errors.ProgrammingError: 1054 (42S22): Unknown column 'sp' in 'where clause'

当我尝试遵循类似问题的答案时,我得到了这个:

qry = "SELECT * FROM %s WHERE group_id = %i AND protein_id = %s"
mycursor.exectue(qry, (assembly_name, group_id, protein_id))

但是,我仍然收到此错误:

mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement

将 %i 更改为 %s 可修复上述错误,但随后出现新错误:

mysql.connector.errors.ProgrammingError: 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 ''peptides_proteins_000005' WHERE group_id = 5 AND protein_id = 'sp|P48740|MASP1_' at line 1

这是循环结束的地方,因为在线查找此错误建议在顶部编写类似于查询的内容。谁能帮我想办法做到这一点?

【问题讨论】:

  • 在您的字符串参数周围添加引号。"SELECT * FROM %s WHERE group_id = %i AND protein_id = '%s'"
  • @DanielM 谢谢,只是想知道,有没有办法让它不容易受到 sql 注入的影响,因为我更喜欢这样,但它工作正常!
  • 是的,使用准备好的语句(你提到的第二种方式,但你仍然需要引号。
  • @DanielM 我得到了与之前在示例中相同的错误。我认为这个错误来自于表名也是一个变量的事实?
  • 你已经用 Django 标记了这个问题。有什么理由不使用 Django ORM?

标签: python mysql django database


【解决方案1】:

对我来说,没有办法做到这一点,所以我不得不在 %s 周围加上文字引号。 我的最终代码如下所示:

assembly_name = peptide_protein_formatter(assembly_name)

    mycursor = mydb.cursor()
    qry = "SELECT peptide_id,search_id FROM %s WHERE group_id = %s AND protein_id = '%s'" % (assembly_name, group_id, protein_id)

    mycursor.execute(qry)

    result = mycursor.fetchall()

【讨论】:

  • 我会在两天内接受我的回答,除非有人想更好地解释这一点并提供其他解决方案:)
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多