繁体   English   中英

将复杂的SQL查询转换为python 2 for SQLite3

[英]Translating a complicated SQL query to python 2 for SQLite3

下面我有一些代码可以连接到数据库并运行查询。 如果将查询打入数据库浏览器中的SQLite,该查询将按预期运行,但是当我在python中运行时,收到错误消息:

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

该查询已经不可读。

无论如何,某些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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM