データベースへの生のSQLクエリーを実行するクエスチョンセット内にメソッドがあります。Django db.connection.cursor.fetchone()は、未処理のSQLが返されないときにemty結果を返します
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文を実行する前に正確なsql文を出力して、明示的な文と比較できるようにします。 –
djangoログのSQL文は、私が記事で説明したものとまったく同じです。 –