简体   繁体   English

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

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

Below I have some code that connects to database and runs a query. 下面我有一些代码可以连接到数据库并运行查询。 This query runs as expected if I punch it into DB Browser for SQLite, but when I run it in python, I receive the error : 如果将查询打入数据库浏览器中的SQLite,该查询将按预期运行,但是当我在python中运行时,收到错误消息:

sqlite3.OperationalError: no such column: CHARACTER_INNATES.PC_ID sqlite3.OperationalError:没有这样的列:CHARACTER_INNATES.PC_ID

I have read some documentation and multiple StackOverflow comments about parameters, and their purpose to prevent problems like injection attacks. 我已经阅读了一些文档和有关参数的多个StackOverflow注释,以及它们用于防止注入攻击等问题的目的。 I tried that approach, which littered '?' 我尝试过这种方法,它乱扔了“?” everywhere, making it unreadable and unmaintainable, and it didn't work. 到处都是它,使它难以阅读且无法维护,并且无法正常工作。 It returned an empty tuple. 它返回一个空的元组。 This leads me to believe there should be an easier way of performing these kinds of SQL queries. 这使我相信应该有一种更简便的方法来执行这类SQL查询。 So is there? 那有吗 Or am I missing something obvious? 还是我缺少明显的东西?

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()

My attempt at a fix looked something like 我的修复尝试看起来像

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

This query already is unreadable. 该查询已经不可读。

Anyway, some SQLite versions have problem with table names hidden inside parentheses. 无论如何,某些SQLite版本存在表名隐藏在括号内的问题。 This typically happens when you're using the Access query builder; 当您使用Access查询构建器时,通常会发生这种情况。 just write the joins properly instead: 只需正确编写连接即可:

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