从给定范围中选择行时,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 变量太多”的主要内容,如果未能解决你的问题,请参考以下文章