Ускорить обновление Python / SQLite? - PullRequest
0 голосов
/ 12 февраля 2019

Я создал 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))

Я используюКод, показанный ниже, обновляет 20 тысяч строк в моей базе данных (для тестирования в данный момент).Я ожидал, что все строки 20 КБ добавят 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 голосов
/ 12 февраля 2019

Вы можете сделать это, используя single SQL UPDATE.Никакой цикл и SELECT не требуется.

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

См. документацию SQLite для UPDATE.

Редактировать

Поскольку SQL довольно мощный, вы можете использовать сложные выражения в SET.Если вы хотите добавить текущее значение Test4 к Test4, сделайте следующее:

SET
  Test2 = Test2 + Test4

Это можно сделать, как описано выше, для более чем одной строки, выбранной с помощью WHERE.Каждая строка будет использовать определенные значения для Test2 и Test4.

...