2015-03-03 68 views
1

我使用python & sqlite3来做一些事情,我需要在sqlte3中创建大量的表。所有表都具有相同的模式是这样的:如何提高在sqlite3中创建表的性能

ID | AA BB CC DD EE FF GG 
1  a b c d e f g 
.  .................... 
.  .................... 
.  .................... 
2000 .................... 


for i in stl_lines[1:]: 
    line = i.split(' ') 
    sql = "CREATE TABLE '%06d'" \ 
         "(A INTEGER UNIQUE NOT NULL," \ 
         " B INTEGER NOT NULL," \ 
         " C INTEGER NOT NULL," \ 
         " D INTEGER NOT NULL," \ 
         " E INTEGER NOT NULL," \ 
         " F REAL NOT NULL," \ 
         " G INTEGER NOT NULL," \ 
         "PRIMARY KEY(DATE))" % (int(line[0])) 
    cursor.execute(sql) 

当我运行这段代码,我发现,我几乎需要1〜2秒,以创建一个表,我有超过2000台,这花了我大约3000S创建数据库,这个代价是不可接受的。 如何提高创建表的速度,或者您对设计数据库有什么建议? 谢谢!


最后,我通过帮助CL解决了问题。。现在我可以在2秒内创建2000张桌子!非常感谢他/她。

这是我的新代码:

db = sqlite3.connect(DB_FILE) 
db.isolation_level = None 
cursor.execute('BEGIN ') 
for i in stock_tables: 
    cursor.execute(i) 
cursor.execute('COMMIT ') 
db.isolation_level = '' 
+1

我认为这里的问题是,sqlite数据库不是设计来处理那么多的表。我建议你重新考虑你的数据结构,以便使用更灵活的列来减少表的数量。 – 2015-03-03 04:11:13

+0

为什么你需要2000多张桌子?为什么你经常这样做,这是一个问题?你为什么把你的列命名为'A'或'B'?你知道谁将不得不维护这个代码,如果是的话,你有多恨他们? – 2015-03-03 04:32:40

+0

对不起,这不是我项目中的正式代码。我只是改变了列的名字,以便于阅读。 – lebowskis 2015-03-03 05:00:38

回答

1

你的问题是Python的;它试图变得聪明并为每个CREATE TABLE语句自动提交一个事务(documentation)。

您想改为使用单个事务。 将isolation_level设置为None,并在所有语句周围执行BEGIN/COMMIT一次。