从给定范围中选择行时,sqlite3.OperationalError“SQL 变量太多”

Posted

技术标签:

【中文标题】从给定范围中选择行时,sqlite3.OperationalError“SQL 变量太多”【英文标题】:sqlite3.OperationalError "too many SQL variables" when selecting rows from given range 【发布时间】:2021-05-17 11:57:20 【问题描述】:

我有一个托管在 Linux 服务器上的网站。后端在 Flask 中完成,我使用的数据库是 SQLite3(带有 Flask-SQLAlchemy)。问题是我需要像下一行那样进行大型查询。

for lhour in hour.query.filter(hour.id.in_([id_hour for id_hour in range(start_at , hour.query.count()+1)])):

上面的代码只是查询id大于start_at变量的所有小时,但是小时表中的行数远远超过999(SQLite3 3.32之前的版本允许的最大值。 0) 因此,只要start_at 变量低于 1600(因为小时表中的行数为 2600),就会引发错误。

在阅读了 3.32.0 之后的版本允许的最大值为 32766 之后,我编译了源代码并在我的 Linux 服务器上安装了 SQLite3 的 3.34.1 版本。

但是,这行代码仍然会抛出完全相同的错误,那么 Flask-SQLAlchemy 使用什么版本的 SQLite3 以及如何设置它以使其使用正确的版本?

【问题讨论】:

【参考方案1】:

使用column.in_(list_of_values) 从数字范围中选择值将导致查询,其中list_of_values 中的每个项目实际上都作为查询中的变量出现。

SQLite 中的限制是单个语句中的变量数,当然不是表中的行数(实际上——理论上的限制是 264)!

请参阅https://www.sqlite.org/limits.html 中的第 9 节和第 13 节。

改用简单的比较:

for lhour in hour.query.filter(hour.id >= start_at):

您不需要为此检查或安装特定的 SQLite 版本。

作为奖励,这只执行一个查询而不是两个。

【讨论】:

以上是关于从给定范围中选择行时,sqlite3.OperationalError“SQL 变量太多”的主要内容,如果未能解决你的问题,请参考以下文章

删除行时,一个或多个必需参数没有给定值

从 Javascript 插件控制 Word 文档中的选择范围

从雪花外部阶段选择行时如何使用正则表达式?

弹出框控件在选择不同的表视图行时更改其位置

当位置超出范围时如何从数组中选择一个值?

在 ms Access 中从每个组中选择至少 3 行时出错 - 仅选择了至少 2 行