【问题标题】:Django db.connection.cursor.fetchone() returns emty result, when raw SQL doesn't当原始 SQL 不返回时,Django db.connection.cursor.fetchone() 返回 emty 结果
【发布时间】:2011-11-16 22:04:16
【问题描述】:

我在一个自定义 QuerySet 中有一个方法,可以对数据库执行原始 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

它返回正确的值。

我哪里错了?请帮忙!

【问题讨论】:

  • 我会让 django 在执行之前打印出确切的 sql 语句,以便您可以将其与显式语句进行比较。
  • django 日志中的 SQL 语句与我在帖子中解释的完全相似。

标签: python sql django mysql-python


【解决方案1】:

尝试不使用", ".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])

【讨论】:

  • @Homer:很高兴它有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多