【问题标题】:sqlite3.OperationalError "too many SQL variables" when selecting rows from given range从给定范围中选择行时,sqlite3.OperationalError“SQL 变量太多”
【发布时间】:2023-03-10 15:53:02
【问题描述】:

我有一个托管在 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 以及如何设置它以使其使用正确的版本?

【问题讨论】:

    标签: python sqlite sqlalchemy


    【解决方案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 版本。

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

    【讨论】:

      猜你喜欢
      • 2020-07-13
      • 2018-11-03
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多