Django db.connection.cursor.fetchone() 返回空结果,而原始SQL却没有

1 投票
1 回答
6228 浏览
提问于 2025-04-17 02:16

我在一个自定义的查询集中有一个方法,它用原生SQL语句去查询数据库。

class QuerySet(models.query.QuerySet):
    def get_short(self, language_code='en'):
        """Returns shortest name for given language"""
        cursor = connection.cursor()
        cursor.execute('''SELECT t.name FROM translation t, name n
                            WHERE n.id IN (%s)
                            AND t.link_id = n.id
                            AND t.lang_id = %s
                            ORDER BY CHAR_LENGTH(t.name)
                            LIMIT 1''', [','.join(["'%s'" % obj.pk for obj in self]), get_language(language_code).pk])
        name = cursor.fetchone()
        if name:
            return name[0]

但是它返回的结果是空的。cursor.fetchone() 返回的是 None,而不是我想要的值。当我在同一个数据库上执行原生SQL语句时:

SELECT t.name FROM translation t, name n
                              WHERE n.id IN ('166','167')
                              AND t.link_id = n.id
                              AND t.lang_id = 40
                              ORDER BY  CHAR_LENGTH(t.name)
                              LIMIT 1

它能正确返回值。

我哪里出错了?请帮帮我!

1 个回答

3

试着不使用 ", ".join 来格式化你的第一个参数。

cursor.execute('''SELECT t.name FROM translation t, name n
                            WHERE n.id IN %s
                            AND t.link_id = n.id
                            AND t.lang_id = %s
                            ORDER BY CHAR_LENGTH(t.name)
                            LIMIT 1''', [tuple(obj.pk for obj in self), get_language(language_code).pk])

撰写回答