我创建了一个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()
答案 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
选择的一行,可以像上面一样进行。每行将使用Test2
和Test4
的特定值。