如何在sqlite3中插入几千列?
这段话的意思是,和我之前的问题有点像,但我遇到了一个新问题。假设我有一个很大的字典(就是一种数据结构,像一个表格),当我尝试用下面的方法把这个大字典插入到数据库时,出现了一个操作错误,提示列太多了。那么,我应该用什么其他方法来填充SQL数据库的列呢?是使用“alter table”命令,然后一个一个地添加每一列吗?
import sqlite3
con = sqlite3.connect('simple.db')
c = con.cursor()
dic = {
'x1':{'y1':1.0,'y2':0.0},
'x2':{'y1':0.0,'y2':2.0,'joe bla':1.5},
'x3':{'y2':2.0,'y3 45 etc':1.5}
}
# 1. Find the unique column names.
columns = set()
for _, cols in dic.items():
for key, _ in cols.items():
columns.add(key)
# 2. Create the schema.
col_defs = [
# Start with the column for our key name
'"row_name" VARCHAR(2) NOT NULL PRIMARY KEY'
]
for column in columns:
col_defs.append('"%s" REAL NULL' % column)
schema = "CREATE TABLE simple (%s);" % ",".join(col_defs)
c.execute(schema)
# 3. Loop through each row
for row_name, cols in dic.items():
# Compile the data we have for this row.
col_names = cols.keys()
col_values = [str(val) for val in cols.values()]
# Insert it.
sql = 'INSERT INTO simple ("row_name", "%s") VALUES ("%s", "%s");' % (
'","'.join(col_names),
row_name,
'","'.join(col_values)
)
2 个回答
0
如果你真的在添加大量数据行,并且遇到了问题,可能是因为你的一次操作太大了。
可以在插入一定数量的行之后做一个提交(commit()),或者为了测试,甚至可以在每次插入后都提交一下,这样也可以。
用sqlite处理几千行数据应该没问题。但如果要处理几百万行,可能就需要考虑其他的解决方案了。这当然还要看很多因素。
8
如果我理解得没错,你不是想插入成千上万的行,而是成千上万的列。SQLite对每个表的列数是有限制的(默认是2000列),不过如果你重新编译SQLite,这个限制是可以调整的。我没有做过这件事,所以不太清楚这样做后是否需要调整Python的接口,但我猜应该不需要。
你可能需要重新考虑一下你的设计。对于任何非数据仓库或在线分析处理(OLAP)应用来说,成千上万的列是非常不寻常的,效率也不高(行是可以的)。而且SQLite并不是处理数据仓库或OLAP类型情况的好选择。你可以考虑使用一种实体-属性-值模型(这通常不是对真正关系数据库的推荐,但它是一个有效的应用数据模型,更有可能满足你的需求,而不会把SQLite的限制推得太远)。