【问题标题】:How to overcome "OperationalError: too many SQL variables"如何克服“OperationalError:SQL 变量太多”
【发布时间】:2018-08-17 14:21:36
【问题描述】:

我正在尝试将大小为 (8760, 1574) 的数据框插入到 SQLite 的表中。我的代码如下:

class DatabaseWorker(object):
    def __init__(self, db_name):
        self.db = db_name

    def create_table(self, table_name, column_names):
        conn = sqlite3.connect(self.db)
        cur = conn.cursor()
        q1 = 'DROP TABLE IF EXISTS %s' %(table_name)
        q2 = 'CREATE TABLE ' + table_name + ' ' + '(' + ', '.join(str(x) for x in column_names) + ')'
        cur.execute(q1)
        cur.execute(q2)
        conn.commit()
        conn.close()

    def insert_table(self, table_name, data):
        conn = sqlite3.connect(self.db)
        data.to_sql(table_name, conn, if_exists='append', index=False)
        conn.commit()
        conn.close()

cnx = DatabaseWorker("users")
cnx.create_table("user_activity", df_final.columns.values.tolist())
cnx.create_table("user_similarity_matrix", df_transformed.columns.values.tolist())
cnx.insert_table("user_activity", df_final)
cnx.insert_table("user_similarity_matrix", df_transformed)

df_final 的大小为(249238, 7)df_transformed 的大小为(8760, 1574)。插入df_final 没有错误,但插入df_transformed 时出现错误。错误如下:

----> 5 cnx.insert_table("user_similarity_matrix", df_transformed)

---> 30 data.to_sql(table_name, conn, if_exists='append', index=False)

pandas_sql.to_sql(frame, name, if_exists=if_exists, index=index, 索引标签=索引标签,架构=架构, chunksize=chunksize, dtype=dtype)

OperationalError: SQL 变量太多

"Too many SQL variables" error in django witih sqlite3 上的答案之一有 999 个变量的限制?有什么办法可以回避。我会很感激你的建议。提前非常感谢。

【问题讨论】:

    标签: python python-3.x sqlite


    【解决方案1】:

    SQLITE_MAX_VARIABLE_NUMBERwas increased in SQLite > 3.32.0 从 999 到 32766。

    1. 单个 SQL 语句中的最大主机参数个数

      [...]

      SQLite 分配空间来保存从 1 到使用的最大主机参数号之间的所有主机参数。因此,包含主机参数(如 ?1000000000)的 SQL 语句将需要千兆字节的存储空间。这很容易使主机的资源不堪重负。为防止内存分配过多,主机参数编号的最大值为 SQLITE_MAX_VARIABLE_NUMBER,3.32.0 (2020-05-22) 之前的 SQLite 版本默认为 999,3.32.0 之后的 SQLite 版本默认为 32766。

    这意味着拥有 1574 列的 df_transformed 在最近的 SQLite 版本中应该也能正常工作。但是请注意 SQLITE_MAX_COLUMN=2000 并且您没有太多空间来增加数据框中的列数。

    SQLITE_MAX_COLUMN 的默认设置是 2000。您可以在编译时将其更改为 32767 这样大的值。另一方面,许多经验丰富的数据库设计人员会争辩说,一个规范化的数据库永远不需要超过 100 列一张桌子。

    在大多数应用程序中,列数很少 - 几十个。 SQLite 代码生成器中有一些地方使用 O(N²) 的算法,其中 N 是列数。

    替代方案可以是在 SQLite TEXT 列中使用 pandas.DataFrame.to_json / pandas.read_json 的自定义文档序列化,pandas.DataFrame sqlite3 adapter 等等。因为SQLITE_MAX_LENGTH 是每行 1GB,所以序列化提供了更宽的数据帧。

    【讨论】:

    • 谢谢你,saaj。这对以后会很有帮助。
    猜你喜欢
    • 2019-05-07
    • 1970-01-01
    • 2017-01-08
    • 2021-04-02
    • 2019-06-05
    • 2023-03-31
    • 2020-08-31
    • 2011-06-14
    • 2015-01-14
    相关资源
    最近更新 更多