Найти - Пользователи
Полная версия: Правильно ли я работаю с БД
Начало » Django » Правильно ли я работаю с БД
1 2
ilnur
привет.

Проект на джанго. БД postgresql
необходимо обновить таблицу в БД, исходные данные это id и значение поля, всего около 100 тысяч записей.
я заполнял все это так

for id, value in input_data:
    pole = Model.objects.filter(id=id)
    if pole.exists():
        pole[0].value = value
        pole[0].save()
    else:
        Model(id=id, value=value).save()

правильно ли я все делаю?

FishHook

тынц
тыдынц
ilnur
а почему у емня не правильно?

У меня будет все медленно работать? Мой код сломает БД или что?
FishHook
ilnur
а почему у емня не правильно?У меня будет все медленно работать? Мой код сломает БД или что?
Вряд ли сломает, хотя по мне создавать запись с жестко заданным id - идея не самая удачная.
Я про то, что код можно сильно сократить и “облагородить”.

for id, value in input_data:
    pole = Model.objects.get_or_create(id=id)
    pole.update(value=value)

А вообще задача какая-то странная. Это может средствами БД лучше сделать?
ilnur
исходные данные в 1 посте условные. В реальности иногда необходимо обновить не малое количесвто записей. И хотелось узнать, чем мой алгоритм плох.
Может его как то отпимизировать можно. Ато если обновлять ~200-300 тыс записей, То скрипт работает 3-5 часов.
FishHook
Это может средствами БД лучше сделать?
т.е писать sql запросы самому?
если да, то джанговсикй орм же формирует сам sql b dsgjkyztn/
или я чего не понял.

мне проще и быстрее на орм написать, + в процессе работы скрипта удобно вести всяки лог файл.
FishHook
Ильнур, Джанговский ОРМ совершенно не предназначен для твоей задачи. С том смысле, что сама Джанга не предусматривает одномоментного обновления сотен тысяч записей, она не для этого. Само по себе 3-5 часов работы скрипта уже говорит, что что-то тут не то. Я уверен где-то на 97%, что твои чаяния можно впихнуть в один SQL-запрос и он выполнится меньше чем за минуту.
Не! Можно забивать гвозди микроскопом, только зачем?
lorien
Если в момент импорта данных никто более не может создавать новые записи, то логично вытащить ID всех существующих записей в память и решать делать update или create просто смотря ID в полученном списке.

Далее, сервер постгреса настроен или с дефолтными настройками?

Ну и вообще если надо очень быстро сделать множественный update, то нужно всякие хаки применять, например:
1) читаем данные из таблицы в память или файл
2) обновляем эти данные в памяти-файле за счёт новых данных
3) создаём новую таблицу в памяти
5) копируем туда данные из памяти-файла черещ LOAD DATA
6) далее старую таблицу удаляем и новой таблице даём имя старо таблицы
reclosedev
Добавлю к тому, что сказали выше.
ilnur
Может его как то отпимизировать можно. Ато если обновлять ~200-300 тыс записей, То скрипт работает 3-5 часов.
Мне кажется, основной тормоз тут коммит для каждой записи.

Одно из решений - db.transaction.commit_manually
http://python.su/forum/post/95829/

В той же теме небольшой тест скорости:
http://python.su/forum/post/96024/
ilnur
reclosedev
тут коммит для каждой записи.
скорее всего да.
на каждую запись по транзакции, так ведь?
можно в одной транзакции обработать допустим 10-20 записей, для надежностинадо будет потестить это.

p.s. django 1.3
reclosedev
ilnur
допустим 10-20 записей
Смотря какой сервер и насколько тяжелы объекты, но я бы начал с нескольких сотен, может даже тысячи.

ilnur
p.s. django 1.3
@transaction.commit_manually уже давно есть.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB