加快Python / SQLite更新?

时间:2019-02-12 09:01:38

标签: python performance sqlite

我创建了一个200行的SQLite数据库。稍后,我需要更新所有这些行。

确切地说,我想通过使用旧值来更新每行的两个值(在我的示例中称为Test2和Test3),然后在其值中添加(在示例中为+200和+400)。

我的代码似乎很慢,所以我添加了一个计时器,因此请看我的代码需要执行多长时间。此刻持续200行,大约0.7879秒。

要使用更大的数据库,需要加速该代码。也许你们可以帮助python / sql初学者提高我的代码效率!

到目前为止,这是我的代码(试图提供一个最小的示例):

import sqlite3
import time

def database_test():
    conn = sqlite3.connect('SQLite_Test.db')
    c = conn.cursor()

    i = 0

    for i in range(200):
        c.execute('SELECT Test2, Test3 FROM Test WHERE Test1 = ?',  (i,))

        DB_Values = []        
        DB_Values = c.fetchone()

        Value1 = DB_Values[0]+200
        Value2 = DB_Values[1]+400

        c.execute('''UPDATE Test SET Test2 = ?, Test3 = ? WHERE Test1= ?''', (Value1, Value2, i))
        i += 1  

    # Save (commit) the changes
    conn.commit() 


start_time = time.time()
database_test()
print("--- %s seconds ---" % round((time.time() - start_time),4))

我使用下面显示的代码来更新数据库中的2万行(此刻进行测试)。我预计所有2万行将1000添加到Test2和Test3。但这并没有发生。第1-3行和第11-21行在它们之间没有任何更新。 101到201也进行了适当的更新,但是之后又出现了巨大的差距。

为什么会这样?

请在下面查看我的代码:

def database_update_test():
    # Open Database
    conn = sqlite3.connect('SQLite_Test.db')
    c = conn.cursor()

    c.execute('''UPDATE Test SET Test2 = Test2+1000, Test3 = Test3+1000 WHERE Test1 >= 0 and Test1 < 20000''')

    # Save (commit) the changes
    conn.commit() 

1 个答案:

答案 0 :(得分:1)

您可以使用 SQL UPDATE来执行此操作。无需循环,也不需要SELECT

UPDATE Test
SET
  Test2 = Test2 + 200,
  Test3 = Test3 + 300
WHERE
  Test1 >= 0 and Test1 < 200;

请参见the SQLite documentation for UPDATE

修改

由于SQL非常强大,因此可以在SET中使用复杂的表达式。如果要将Test4的当前值添加到Test4,请执行以下操作:

SET
  Test2 = Test2 + Test4

对于以上使用WHERE选择的一行,可以像上面一样进行。每行将使用Test2Test4的特定值。