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 个变量的限制?有什么办法可以回避。我会很感激你的建议。非常感谢。
SQLITE_MAX_VARIABLE_NUMBER 在 SQLite > 3.32.0 中,该值从 999 增加到 32766。
\n\n\n
\n- \n
单个SQL语句中主机参数的最大数量
\n[...]
\nSQLite 分配空间来保存 1 到所使用的最大主机参数编号之间的所有主机参数。因此,包含主机参数(如 ?1000000000)的 SQL 语句将需要 GB 的存储空间。这很容易耗尽主机的资源。为了防止内存分配过多,主机参数编号的最大值为SQLITE_MAX_VARIABLE_NUMBER,对于3.32.0(2020-05-22)之前的SQLite版本,默认值为999;对于3.32.0之后的SQLite版本,默认值为32766。
\n
这意味着您df_transformed拥有 1574 列应该可以在最近的 SQLite 版本中正常工作。但请注意,SQLITE_MAX_COLUMN=2000您没有太多空间来增加数据框中的列数。
\n\nSQLITE_MAX_COLUMN 的默认设置是 2000。您可以在编译时将其更改为大至 32767 的值。另一方面,许多经验丰富的数据库设计人员会认为,良好规范化的数据库永远不需要表中超过 100 列。
\n在大多数应用中,列的数量很少 - 几十个。SQLite 代码生成器中的某些位置使用 O(N\xc2\xb2) 算法,其中 N 是列数。
\n
替代方案可以是在 SQLite列、适配器等中使用pandas.DataFrame.to_json/进行自定义文档序列化。由于每行 1GB,序列化可提供更宽的数据帧。pandas.read_jsonTEXTpandas.DataFrame sqlite3 SQLITE_MAX_LENGTH
| 归档时间: |
|
| 查看次数: |
3394 次 |
| 最近记录: |