2010-12-13 3 views
2
  • У меня есть CSV файл со списком элементов, которые мне нужно хранить в базе данных.Batch существование проверка + сохранить - Джанго

  • Мне нужно проверить, какие элементы еще не сохранены, и если они не сохранены, мне необходимо сохранить их в базе данных.

  • 2-5 миллионов строк.


Модель Модель пользователя Джанго.

У меня есть CSV-файл этой формы:

ITEM_ID, Фамилия, Policy_number, пол, название, Дата_начала

Это код:

import csv 

reader = csv.reader(open('items.csv', 'rb')) 

for index, row in enumerate(reader): 
    if User.objects.filter(username=row[2]).count(): 
     continue 
    try: 
     user = User(username=row[2],last_name=row[1],password='*') 
     user.save() 
    except Exception, e: 
     print e 
    del user 
    del row 
    del index 

Какой метод вы бы порекомендовали?

+0

Почему 'del'? Это обрабатывается автоматически. Для этого редко есть веская причина. Какое у вас определение модели? В частности, какие параметры индекса вы указали в атрибуте 'username'? –

ответ

1

Вам нужно загрузить файл CSV, а затем пройти через каждую строку, используя метод get_object_or_create, чтобы проверить, существует ли объект, если нет, то он создаст его для вас. Если вы покажете нам код models.py, мы сможем помочь вам более конкретно.

+0

Это кажется самым быстрым способом благодаря! – RadiantHex

+0

Ваш прием, рад помочь – TheLifeOfSteve

2

В зависимости от ситуации. Если данные CSV могут быть преобразованы в модели, что-то вроде этого нужно сделать:

  • нагрузки CSV-данные
  • для каждой строки:
    • проверить, если модель для этого существует
    • если не :
      • Создайте новую модель на основе данных и сохраните ее.

Edit:
Я думаю, что партия проверка на существование будет трудно. Пакетное сохранение моделей было бы более быстрым, но в зависимости от сложности модели я думаю, что это просто заставка для каждой модели.

+0

Спасибо за ответ :) Я уже сделал это: использование памяти 1.1Gb после 600k строк и довольно медленное тоже :) – RadiantHex

+0

Итак, вы закончили? :) –

+0

@RadiantHex: Если это медленно, вы должны задать другой вопрос. Вам нужно будет предоставить фактическую модель и фактический код, и вам нужно будет убедиться, что ваши поиски - это простое «точное» совпадение, и у вас есть индексы. Примите этот ответ, найдите «медленный запрос Django» и, при необходимости, откройте новый вопрос. –

1

Если ваша память может обрабатывать переменную usernames, это может быть хорошей оптимизацией.

import csv 

reader = csv.reader(open('items.csv', 'rb')) 

usernames = User.objects.values('username') 

for index, row in enumerate(reader): 
    if row[2] in usernames: 
     continue 
    User.objects.create(username=row[2],last_name=row[1],password='*') 

Если действительно есть проблема памяти, вы можете взглянуть на, например, это (существующий) ответ: Question about batch save objects in Django

1

Попробуйте это.count() будет ОЧЕНЬ дорогим.

for index, row in enumerate(reader): 
    try: 
     User.objects.get(username=row[2]) 
    except User.DoesNotExist: 
     user = User(username=row[2],last_name=row[1],password='*') 
     user.save() 
Смежные вопросы