2016-04-29 151 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

谢谢。接受为答案。 –