【问题标题】:SQLite query throws a syntax error in code but works fine when copied into sqlite db browserSQLite 查询在代码中引发语法错误,但在复制到 sqlite db 浏览器时工作正常
【发布时间】:2020-01-20 17:33:42
【问题描述】:

解决方案:我安装了不支持 RANK() 的过期版本的 sqlite。我通过安装 Python3.7.4 解决了这个问题

当用户根据两列之和按降序排序时,我试图找到用户的位置。我在 SQLite DB 浏览器中测试了这个查询,它返回了正确的结果,但是当我将它复制到我的 Python 脚本中时,它会在 "("

之一处引发语法错误

我尝试在执行查询之前运行代码并停止它,以便我可以将查询逐字复制到数据库浏览器中。当我这样做时,它工作得很好,但是当我在我的脚本中执行查询时它失败了

这是字符串连接返回的纯文本查询:

SELECT top_rank FROM (
    SELECT username, RANK() OVER(ORDER BY summed DESC) AS 'top_rank' 
    FROM (
        SELECT SUM(positive_qc) - SUM(negative_qc) AS 'summed', username 
        FROM sub_activity 
        WHERE sub_name IN('cryptocurrency', 'cryptomarkets', 'cryptotechnology', 'blockchain') 
    GROUP BY username)
) WHERE username = 'someuser'

这是我用来获取该查询的代码:

select_str = "SELECT top_rank FROM(" + \
                    "SELECT " + self.KEY2_USERNAME + ", RANK() OVER(ORDER BY summed DESC) AS 'top_rank' " \
                    "FROM(" \
                        "SELECT SUM(" + self.KEY2_POSITIVE_QC + ") - SUM(" + self.KEY2_NEGATIVE_QC + ") " \
                        "AS 'summed', " + self.KEY2_USERNAME + " " \
                        "FROM " + self.TABLE_SUB_ACTIVITY + " " \
                        "WHERE " + self.KEY2_SUB_NAME + " IN('" + "', '".join(sub_list) + "') " \
                    "GROUP BY " + self.KEY2_USERNAME + ")" \
             ") WHERE " + self.KEY2_USERNAME + " = ?"

我在脚本中执行时得到的确切错误是

sqlite3.OperationalError: near "(": syntax error

更新:我已将错误范围缩小到查询的 RANK () OVER(ORDER BY summed DESC) 部分

【问题讨论】:

  • 你试过在FROM(之间加一个空格"SELECT top_rank FROM(" + \ 吗?
  • @MyNameIsCaleb 我刚刚尝试过并得到了相同的结果。我什至在所有左括号和右括号之间添加了空格,并且错误没有改变。这是查询现在的样子:sql SELECT top_rank FROM ( SELECT username, RANK() OVER ( ORDER BY summed DESC ) AS top_rank FROM ( SELECT SUM ( positive_qc ) - SUM ( negative_qc ) AS summed, username FROM sub_activity WHERE sub_name IN ( 'cryptocurrency', 'cryptomarkets', 'cryptotechnology', 'blockchain'' ) GROUP BY username ) ) WHERE username = ?
  • 在帖子中,WHERE sub_name IN('cryptocurrency' 这看起来像是问题所在。在IN( 之间。
  • @WEI_DBA 我只是尝试在每个 ( 和 ) 之前和之后使用空格执行查询,但它仍然有相同的错误
  • 您的 SQLite 版本是否至少为 3.25.0 才能使用窗口函数?

标签: python sql sqlite


【解决方案1】:

试一试...我为每个子查询设置了别名。 uiuo

SELECT top_rank FROM (
    SELECT username, RANK() OVER(ORDER BY summed DESC) AS 'top_rank' 
    FROM (
        SELECT SUM(positive_qc) - SUM(negative_qc) AS 'summed', username 
        FROM sub_activity 
        WHERE sub_name IN ('cryptocurrency', 'cryptomarkets', 'cryptotechnology', 'blockchain') 
    GROUP BY username) ui
) uo WHERE username = 'someuser'

【讨论】:

  • 我刚刚尝试过,但仍然遇到同样的错误。我认为问题出在查询的 RANK() OVER() 部分。当我删除所有内容但仍然抛出错误时
  • 然后我会按照@forpas 的建议查看版本。
  • 你说的版本号是对的!我刚刚更新到 Python 3.7.8,它的工作就像一个魅力。如果我能吻你,我会
  • @JamesGrusheski 您应该感谢 forpas 的原始问题。 forpas 是建议检查版本的人。
猜你喜欢
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
相关资源
最近更新 更多