2009-03-24 9 views
0

J'ai écrit un programme qui génère un programme Python qui remplit mon application Django avec des données. Ce programme a cependant une taille de 23 Mo et mon ordinateur ne l'exécutera pas. Y a-t-il une solution pour cela?Remplir l'application Django avec des données en utilisant un très grand script Python

Une autre solution possible pour remplir la base de données serait l'utilisation d'un appareil. Le problème est que je ne connais pas encore les nouvelles clés primaires ... ou que je devrais utiliser les anciennes (que je ne préfère pas).

Des suggestions?

La raison de mon chemin: Je migre une base de données très différente de la nouvelle, elle a aussi de nombreuses relations. Le programme 23 Mo se souvient de tous les objets de la base de données source, c'est pourquoi il n'est pas facilement coupé de moitié. Peut-être qu'il y a une meilleure façon de faire cela? Je préfère utiliser Django que d'utiliser du SQL brut.

+1

Pouvez-vous publier un extrait de ce programme de 23 Mo? –

+0

Je vois que le code est très inefficace, au niveau du code. J'essaie de le rendre plus petit en utilisant des fonctions! –

+0

Pourriez-vous expliquer pourquoi vous avez transformé vos données en une grande pile de code au lieu d'écrire un petit programme pour lire vos données et créer des objets modèles Django? –

Répondre

1

Dans la plupart des cas, vous pouvez trouver une hiérarchie naturelle à vos objets. Parfois, il y a une sorte de "maître" et tous les autres objets ont des références de clé étrangère (FK) à ce maître et l'un à l'autre.

Dans ce cas, vous pouvez utiliser une structure de type XML avec chaque objet maître "contenant" un grand nombre d'objets secondaires. Dans ce cas, vous insérez d'abord le maître et tous les enfants ont des références FK à un objet existant.

Dans certains cas, cependant, il existe des relations qui ne peuvent pas être simples FK à un objet existant. Dans ce cas, vous avez des dépendances circulaires et vous devez (1) interrompre temporairement cette dépendance et (2) recréer la dépendance après le chargement des objets.

Pour cela, vous devez (a) définir votre modèle pour avoir un FK optionnel, (b) et avoir une référence temporaire de "clé naturelle". Vous chargez les données sans le bon FK (c'est facultatif). Ensuite, après le chargement de vos données, vous passez en revue un deuxième passage et insérez toutes les références FK manquantes. Une fois cela fait, vous pouvez ensuite modifier votre modèle pour rendre le FK obligatoire.

Programme 1 - exportation de l'ancienne base de données vers un fichier plat simple. Format CSV ou format JSON ou quelque chose de simple.

for m in OldModel.objects.all(): 
    aDict = { 'col1':m.col1, 'old_at_fk':m.fktoanothertable.id, 'old_id':id } 
    csvwriter.writerow(aDict) 

Programme 2 - lire un fichier plat simple; construire de nouveaux objets de modèle de base de données.

# Pass 1 - raw load 

for row in csv.reader: 
    new= NewModel.create(**row) 

# Pass 2 - resolve FK's 

for nm in NewModel.objects.all(): 
    ref1= OtherModel.objects.get(old_id=nm.old_at_fk) 
    nm.properfk = ref1 
    nm.save() 
+0

en utilisant pickle pour lire et écrire des dictionnaires ressemble à la façon la plus simple –

0

Votre ordinateur ne l'exécute pas parce que c'est un programme volumineux?

Peut-être que vous devez faire référence à un fichier externe ou des fichiers, avec toute la structure, puis le jeter dans la base de données, au lieu de l'écrire dans votre script/logiciel ...

0

Mettre les données dans un document distinct fichier (ou fichiers). Ensuite, écrivez un petit programme qui lit dans les données et remplit votre base de données via Django.

0

Si je lis correctement votre message, vous lisez de l'ancienne base de données et écrivez un "programme python" basé sur ces données. Cela me semble être la mauvaise façon de le faire. Ma suggestion serait de créer une version malléable de l'ancienne base de données (XML fonctionnerait bien pour cela) en lisant les données de la base de données, en les modifiant si nécessaire, puis en les vidant dans un fichier.

Avec cette version malléable des données, utilisez un programme distinct pour importer ces données dans la nouvelle base de données via vos modèles Django.

Cela vous donnera également un niveau de flexibilité si jamais vous avez besoin de dupliquer ce processus.

Questions connexes