2013-06-27 15 views
6

を含まなければならない私は(直接データベース上でテスト)このSQL文の結果は私のviews.py生のクエリはプライマリキー

Message.objects.raw(''' 
     SELECT s1.ID, s1.CHARACTER_ID, MAX(s1.MESSAGE) MESSAGE, MAX(s1.c) occurrences 
     FROM 
      (SELECT ID, CHARACTER_ID, MESSAGE, COUNT(*) c 
      FROM tbl_message WHERE ts > DATE_SUB(NOW(), INTERVAL %s DAY) GROUP BY CHARACTER_ID,MESSAGE) s1 
     LEFT JOIN 
      (SELECT ID, CHARACTER_ID, MESSAGE, COUNT(*) c 
      FROM tbl_message WHERE ts > DATE_SUB(NOW(), INTERVAL %s DAY) GROUP BY CHARACTER_ID,MESSAGE) s2 
      ON s1.CHARACTER_ID=s2.CHARACTER_ID 
     AND s1.c < s2.c 
     WHERE s2.c IS NULL 
     GROUP BY CHARACTER_ID 
     ORDER BY occurrences DESC''', [days, days]) 

に生のSQL文を得た:

ID | CHARACTER_ID | MESSAGE | OCCURENCES 
----+--------------+---------+-------------- 
148 | 10   | test | 133 

しかし、すべてのI持っているInvalidQuery情報の例外Raw query must include the primary key

私はdocsを確認し、次に読んだ:

プライマリキー フィールドを除外できないフィールドは1つだけです。プライマリキーを含めるのを忘れた場合、InvalidQuery例外が発生します。

ご覧のとおり、要求されたプライマリキーが私のステートメントに追加されています。どうしましたか?

class Message(models.Model): 
    character = models.ForeignKey('Character') 
    message = models.TextField() 
    location = models.ForeignKey('Location') 
    ts = models.DateTimeField() 

    class Meta: 
     pass 

    def __unicode__(self): 
     return u'%s: %s...' % (self.character, self.message[0:20]) 
+0

この問題は解決していますか? – dusan

+0

私はビューを使って回避策を講じましたが、解決策があれば投稿してください。 – Thomas

+0

'Message'モデルを投稿できますか? – dusan

答えて

8

私は、Python 2.7.5、Djangoの1.5.1とMySQL 5.5を使用して、同じ問題を再現。

私はresults変数へraw呼び出しの結果を保存したので、私はそれに何が含まれているかの列をチェックすることができます

>>> results.columns 
['ID', 'CHARACTER_ID', 'MESSAGE', 'occurrences'] 

IDは大文字である、あなたのクエリで私はs1.ids1.IDを変えようにそれは動作します:

>>> results = Message.objects.raw(''' 
...   SELECT s1.id, s1.CHARACTER_ID, MAX(s1.MESSAGE) MESSAGE, MAX(s1.c) occurrences 
...   FROM 
...   (SELECT ID, CHARACTER_ID, MESSAGE, COUNT(*) c 
...    FROM tbl_message WHERE ts > DATE_SUB(NOW(), INTERVAL %s DAY) GROUP BY CHARACTER_ID,MESSAGE) s1 
...   LEFT JOIN 
...   (SELECT ID, CHARACTER_ID, MESSAGE, COUNT(*) c 
...    FROM tbl_message WHERE ts > DATE_SUB(NOW(), INTERVAL %s DAY) GROUP BY CHARACTER_ID,MESSAGE) s2 
...   ON s1.CHARACTER_ID=s2.CHARACTER_ID 
...   AND s1.c < s2.c 
...   WHERE s2.c IS NULL 
...   GROUP BY CHARACTER_ID 
...   ORDER BY occurrences DESC''', [days, days]) 
>>> results.columns 
['id', 'CHARACTER_ID', 'MESSAGE', 'occurrences'] 
>>> results[0] 
<Message_Deferred_character_id_location_id_message_ts: Character object: hello...> 
+1

よくやったよ、よくできた – Thomas

3

があなたのクエリにIDとして1を含める

Message.objects.raw(''' 
     SELECT 1 as id , s1.ID, s1.CHARACTER_ID, MAX(s1.MESSAGE) MESSAGE, MAX(s1.c) occurrences 
     FROM 
      (SELECT ID, CHARACTER_ID, MESSAGE, COUNT(*) c 
      FROM tbl_message WHERE ts > DATE_SUB(NOW(), INTERVAL %s DAY) GROUP BY CHARACTER_ID,MESSAGE) s1 
     LEFT JOIN 
      (SELECT ID, CHARACTER_ID, MESSAGE, COUNT(*) c 
      FROM tbl_message WHERE ts > DATE_SUB(NOW(), INTERVAL %s DAY) GROUP BY CHARACTER_ID,MESSAGE) s2 
      ON s1.CHARACTER_ID=s2.CHARACTER_ID 
     AND s1.c < s2.c 
     WHERE s2.c IS NULL 
     GROUP BY CHARACTER_ID 
     ORDER BY occurrences DESC''', [days, days]) 
関連する問題