2011-09-14 11 views
1

データベースへの生の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 

適切な値を返します。

どこが間違っていますか?助けてください!

+0

私は、djangoがSQL文を実行する前に正確なsql文を出力して、明示的な文と比較できるようにします。 –

+0

djangoログのSQL文は、私が記事で説明したものとまったく同じです。 –

答えて

3

​​を使用せずに、最初のパラメータをフォーマットしてみてください。

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]) 
+0

解決のためのThanx、問題解決。 –

+0

@Homer:それは役に立ちました:) – mouad

関連する問題