【问题标题】:Python: unsupported format character ''' (0x27) at index 350Python:索引 350 处不支持的格式字符 ''' (0x27)
【发布时间】:2021-08-16 06:52:41
【问题描述】:

我在使用 django 的 MySQL db 后端时遇到了这个错误。

我正在尝试执行的查询(它与 MariaDB 连接器完美配合):

cursor.execute("SELECT a.*, COALESCE( NULLIF(a.aa_change_ref_gene, '.'), NULLIF(a.gene_detail_ref_gene,'.') ) AS variant, b.*, c.* FROM `db-dummy`.specimen_genome_data c JOIN `db-dummy`.genome_info a ON a.record_id = c.genome_id JOIN `db-dummy`.specimen_data b ON b.record_id = c.specimen_id WHERE a.gene_name LIKE concat(?, '%') ORDER BY a.gene_name LIMIT 30", (gene,))

我尝试过的:

基本上将'%' 替换为"%"'%%'

然后我收到"%" 案例的此错误:

异常类型:TypeError 异常值:
并非所有参数都在字符串格式化期间转换

'%%' 案例的此错误:

异常类型:ProgrammingError 异常值:
并非所有参数都在字节格式化期间转换 异常位置:/home/prime/.env/intervar/lib/python3.6/site-packages/MySQLdb/cursors.py 在执行中,第 203 行

【问题讨论】:

  • 您是否更改了查询?第一个错误抱怨在查询中的第 350 个字符处有 ',但提供的查询只有 343 个字符。
  • 是的,出于安全原因,我更改了一些名称,但基本上是在抱怨 '%' 部分。

标签: python mysql django


【解决方案1】:

Django 不使用? 进行参数化,而是使用格式字符串样式参数,即'%s' % 'hello' 等。参见Passing parameters into raw [Django docs]

看起来您想要查询LIKE '<SOMETHING>%' 形式的查询,首先不要使用?(改用%s),然后不要尝试在查询中进行连接,而不是在python 本身。

因此您的查询应该是(截断的不相关部分):

cursor.execute("SELECT ... a.gene_name LIKE %s ORDER BY ...", ('{}%'.format(gene),))

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 2021-06-06
    • 2023-03-29
    • 1970-01-01
    • 2013-10-28
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    相关资源
    最近更新 更多