2016-04-29 67 views
0

下面我有一些代碼連接到數據庫並運行查詢。此查詢運行,如果我衝它到數據庫瀏覽器SQLite作爲預期,但是當我在python運行它,我收到錯誤:將複雜的SQL查詢翻譯成Python 2 for SQLite3

sqlite3.OperationalError:沒有這樣的列:CHARACTER_INNATES.PC_ID

我已經閱讀了一些關於參數的文檔和多個StackOverflow評論,以及它們的目的,以防止注入攻擊等問題。我嘗試了那種散佈'?'的方法。無處不在,使其無法讀取,無法維護,而且無法正常工作。它返回一個空元組。這使我相信應該有更簡單的方法來執行這些類型的SQL查詢。那麼在那裏?還是我錯過了明顯的東西?

db = sqlite3.connect('TheGame.db') 
db.text_factory = str 
conn = db.cursor() 
query = 'SELECT CHARACTERS.Full_Name, CHARACTER_INNATES.PC_ID, SKILLS_INNATES.Skill, Sum([CHARACTER_INNATES].[Current]*[Weight]) AS [Current Innate], Sum([CHARACTER_INNATES].[Maximum]*[Weight]) AS [Max Innate]\ 
     FROM CHARACTERS INNER JOIN (SKILLS_INNATES INNER JOIN CHARACTER_INNATES ON SKILLS_INNATES.Innate = CHARACTER_INNATES.Innate) ON CHARACTERS.ID = CHARACTER_INNATES.PC_ID\ 
     GROUP BY CHARACTERS.Full_Name, CHARACTER_INNATES.PC_ID, SKILLS_INNATES.Skill\ 
     ORDER BY CHARACTER_INNATES.PC_ID, Sum([CHARACTER_INNATES].[Current]*[Weight]) DESC;' 
conn.execute(query) 
print conn.fetchall() 

我在一個固定的嘗試看起來像

params = ('CHARACTERS.Full_Name', 'CHARACTER_INNATES.PC_ID', ...) #this continued for awhile 
query = 'SELECT ?, ?, ?, ...' 
conn.execute(query, params) 
print conn.fetchall() # prints empty tuple 
+0

通過任何機會,你已經嘗試executemany而不是執行,它也沒有工作嗎? –

+0

沒有工作。不過,我可能會濫用它。 –

回答

0

該查詢已經是不可讀。

無論如何,一些SQLite版本隱藏在圓括號內的表名存在問題。這通常發生在您使用Access查詢構建器時;只需正確地寫入連接:

SELECT CHARACTERS.Full_Name, 
     CHARACTER_INNATES.PC_ID, 
     SKILLS_INNATES.Skill, 
     Sum(CHARACTER_INNATES.Current * Weight) AS "Current Innate", 
     Sum(CHARACTER_INNATES.Maximum * Weight) AS "Max Innate" 
FROM CHARACTERS 
INNER JOIN CHARACTER_INNATES ON CHARACTERS.ID = CHARACTER_INNATES.PC_ID 
INNER JOIN SKILLS_INNATES USING (Innate) 
GROUP BY CHARACTERS.Full_Name, 
     CHARACTER_INNATES.PC_ID, 
     SKILLS_INNATES.Skill 
ORDER BY CHARACTER_INNATES.PC_ID, 
     Sum(CHARACTER_INNATES.Current * Weight) DESC; 
+0

不起作用。 sqlite3.OperationalError:無法加入使用列Innate - 列在兩個表中都不存在 –

+0

對不起;現在修好。 –

+0

謝謝。接受爲答案。 –