如何克服“OperationalError:SQL 变量过多”

Kri*_*lal 9 python sqlite python-3.x

我正在尝试将大小的数据框插入(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)
Run Code Online (Sandbox Code Playgroud)

尺寸df_finalIS(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(框架,名称,if_exists=if_exists,index=index,index_label=index_label,schema=schema,chunksize=chunksize,dtype=dtype)

OperationalError:SQL 变量过多

django 中的“SQL 变量太多”错误的答案之一是sqlite3有 999 个变量的限制?有什么办法可以回避。我会很感激你的建议。非常感谢。

saa*_*aaj 1

SQLITE_MAX_VARIABLE_NUMBER 在 SQLite > 3.32.0 中,该值从 999 增加到 32766。

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

    \n

    [...]

    \n

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

    \n
  2. \n
\n
\n

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

\n
\n

SQLITE_MAX_COLUMN 的默认设置是 2000。您可以在编译时将其更改为大至 32767 的值。另一方面,许多经验丰富的数据库设计人员会认为,良好规范化的数据库永远不需要表中超过 100 列。

\n

在大多数应用中,列的数量很少 - 几十个。SQLite 代码生成器中的某些位置使用 O(N\xc2\xb2) 算法,其中 N 是列数。

\n
\n

替代方案可以是在 SQLite列、适配器等中使用pandas.DataFrame.to_json/进行自定义文档序列化。由于每行 1GB,序列化可提供更宽的数据帧。pandas.read_jsonTEXTpandas.DataFrame sqlite3 SQLITE_MAX_LENGTH

\n