2012-05-31 60 views
0

我有一個管理命令執行SQL IN功能

from django.db import connection 
from django.core.management.base import BaseCommand 

class Command(BaseCommand): 
    args = "[id]" 

    def handle(self, id, **options): 
    ids = [] 
    if '-' in id: 
     splitted = id.split('-') 
     for n in range(int(splitted[0]), int(splitted[1])+1): 
      ids.append(n) 
    else: 
     ids.append(id) 
    c = connection.cursor() 
    c.execute('SELECT content FROM log WHERE id IN %s', [ids]) 

我可以通過輸入命令名稱來運行這一點,並指定paramater(ID)

當我運行command 200-205,for循環返回一個列表:

ids =[200, 201, 202, 203, 204, 205] 

而且把這個查詢:

SELECT content FROM log WHERE id IN (200, 201, 202, 203, 204, 205) 

Briljant!

當我運行command 200 IDS將是:

ids = [200] 

執行查詢將返回一個錯誤:

(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 1") 

好像SELECT content FROM log WHERE id IN (200)不工作時它應該。

我在這裏做錯了什麼?

回答

1

你的代碼看起來好給我,但我不流利的那些Django的庫。一些(或許是顯而易見的)解決方法:(1)構造兩個不同的SQL語句來執行;在one-ID情況下,對於one-ID情況,這又是一個簡單的SELECT content FROM log WHERE id =(2),使用兩個期望ID的實例創建一個數組,以便Django構造此SQL:SELECT content FROM log WHERE id IN (200, 200)。換句話說,

else: 
    ids.append(id) 
    ids.append(id) 
+0

如果我這樣做,我會得到一個錯誤:_mysql_exceptions.Warning:截斷不正確的DOUBLE值: ''200'' – nelsonvarela

+0

沒關係......您的解決方案適合我! – nelsonvarela

+0

你有選擇(1)或選項(2)嗎? –

0

你是否錯過了一些括號?

SELECT content FROM log WHERE id IN 200 

SELECT content FROM log WHERE id IN (200) 
+0

看來添加parenthesses時候去完善,但隨後運行了一系列命令時出錯:200-205 ......出現以下錯誤:操作數應包含1列(S ) – nelsonvarela

+0

如果您可以在執行之前打印/顯示/記錄您要執行的SQL語句,則可能會很快發現問題。 –

+0

不幸的是,我無法打印。 – nelsonvarela