Форум сайта python.su
0
Для PostgreSQL:
params = defaultdict(list) for item in goods: params['names'].append(item.name) params['date_a'].append(item.date1) params['date_b'].append(item.date2) params['date_c'].append(item.date3) params['text_a'].append(item.text1) params['text_b'].append(item.text2) params['text_c'].append(item.text3) params['integer_a'].append(item.integer) params['ids'].append(item.id) cursor = connection.cursor() cursor.execute('''UPDATE tbl SET "name" = item.name, "date1" = item.date_a, "date2" = item.date_b, "date3" = item.date_c, "text1" = item.text_a, "text2" = item.text_b, "text3" = item.text_c, "integer" = item.integer_a FROM (select unnest(%(names)s) AS price, unnest(%(date_a)s) AS date_a, unnest(%(date_b)s) AS date_b, unnest(%(date_c)s) AS date_c, unnest(%(text_a)s) AS text_a, unnest(%(text_b)s) AS text_b, unnest(%(text_c)s) AS text_c, unnest(%(integer_a)s) AS integer_a, unnest(%(ids)s) AS _id) AS item WHERE tbl."id" = item._id;''', params)
neitro
Мне нужно обновить 10к строк.
Попытки через алхимию и sqlite3 выполняются очень долго ~ 5-10 часов.
Встал вопрос, как это исправить, как ускорить этот процесс, т.е. сделать массовый update.
Офлайн
0
Собсвенно индекс решил задачу со скоростью работы - выполняется несколько секунд, база разрослась на 25%. Что не критично.
4kpt_III
Получать порциями и обновлять, если нужно. Для этого есть in_ в алхимии.
Офлайн
39
neitro
А вот, как апнуть через in_ я в мануале не нашел…
Отредактировано 4kpt_III (Авг. 6, 2015 12:14:52)
Офлайн
0
4kpt_IIIНужно Обновлять по 1 записи или есть возможность массовой замены аналогично executemany в библиотеке sqlite3 в алхимии.
Предполагалось сначала получить, а потом уже обновлять, если надо. Обновляется легко. Просто назначаете новые атрибуты и commit().
Ну и update никто не отменял. Но все равно, я за проверку необходимости обновления вместо массового обновления.
Офлайн
39
Получили 100 записей. Обновили их по-полям. Потому сделали .commit(). 100 записей обновлятся в БД.
P.S. Если есть данные, которые требуют обновления только 1 поля и только того, которое ставится на автомате, то можно просто прикрутить event. Тогда во всех полях автоматом будет это поле изменяться при commit'e, при этом ручками ничего делать не нужно будет.
Отредактировано 4kpt_III (Авг. 6, 2015 19:45:05)
Офлайн
39
Мало того, возникает вопрос, что делать с записями, которых еще или уже нет в обновляемой базе? Их же нужно удалять или добавлять.
P.S. Ну и не проще ли одну базу вынести на внешний сервис. Чтобы к ней все “друзья-товарищи” подключались?
Отредактировано 4kpt_III (Авг. 6, 2015 16:06:52)
Офлайн
0
4kpt_IIIТакой ситуации не возникнет.
Мало того, возникает вопрос, что делать с записями, которых еще или уже нет в обновляемой базе? Их же нужно удалять или добавлять.
4kpt_III
P.S. Ну и не проще ли одну базу вынести на внешний сервис. Чтобы к ней все “друзья-товарищи” подключались?
Офлайн
39
neitro
Посмотрел стек. Вы на правильном пути.
Офлайн