2010-12-13 61 views
2
  • J'ai un fichier Liste d'articles CSV que je dois stocker au sein de la base de données.lot vérification de l'existence + save - Django

  • Je dois vérifier quels éléments ne sont pas déjà stockés, et s'ils ne sont pas stockés, je dois les enregistrer dans la base de données.

  • Il existe 2-5 millions lignes.


Le modèle est le modèle de l'utilisateur de Django.

Je dispose d'un fichier CSV de cette forme:

ITEM_ID, Nom, Policy_number, le sexe, Titre, date_début

Voici le code:

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 

Toute méthode que vous recommanderiez?

+0

Pourquoi le 'del'? C'est géré automatiquement. Il y a rarement une bonne raison à cela. Quelle est la définition de votre modèle? Plus précisément, quelles options d'index avez-vous spécifiées sur l'attribut 'username'? –

Répondre

1

Vous voudrez charger le fichier CSV, puis parcourir chaque ligne en utilisant la méthode get_object_or_create pour vérifier et voir si l'objet existe, sinon il le créera pour vous. Si vous nous montrez le code models.py, nous pourrons peut-être vous aider plus spécifiquement.

+0

Cela semble être le moyen le plus rapide grâce! – RadiantHex

+0

votre accueil, heureux d'aider – TheLifeOfSteve

2

Cela dépend de la situation. Si les données csv peuvent être converties en un modèle, quelque chose comme cela devrait faire:

  • charge les données csv
  • pour chaque ligne:
    • vérifier si un modèle pour elle existe
    • sinon :
      • créer un nouveau modèle basé sur les données et enregistrez-le.

Edit:
Je pense un contrôle de lot pour l'existence sera difficile. Une sauvegarde en lot des modèles serait plus rapide, mais selon la complexité du modèle, je pense qu'il est plus économique de le faire par modèle.

+0

Merci pour la réponse :) Je l'ai déjà fait: utilisation de la mémoire 1.1Gb après 600k lignes et assez lent aussi :) – RadiantHex

+0

Alors vous avez terminé? :) –

+0

@RadiantHex: Si c'est lent, vous devez poser une question différente. Vous devrez fournir le modèle actuel et le code réel, et vous devrez vous assurer que vos recherches sont simples et que vous avez des index. Acceptez cette réponse, recherchez "Requête lente Django" et, si nécessaire, ouvrez une nouvelle question. –

1

Si votre mémoire peut gérer la variable des noms d'utilisateurs, cela peut être une bonne optimisation.

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='*') 

S'il y a vraiment un problème de mémoire, vous pouvez jeter un oeil à ce par exemple (existant) réponse: Question about batch save objects in Django

1

essayer.Le count() va être très cher.

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()