2010-04-07 5 views
0

Je voudrais parcourir un calcul sur une colonne de valeurs dans une base de données MySQL. Je me demandais si Django avait une fonctionnalité intégrée pour le faire. Auparavant, je viens d'utiliser les éléments suivants pour stocker chaque colonne comme une liste de tuples avec le nom table_column:Itérer sur une colonne de base de données dans Django

import MySQLdb 
import sys 

try: 
    conn = MySQLdb.connect (host = "localhost", 
          user = "user", 
          passwd="passwd", 
          db="db") 
except MySQLdb.Error, e: 
    print "Error %d: %s" % (e.args[0], e.args[1]) 
    sys.exit (1) 

cursor = conn.cursor() 

for table in ['foo', 'bar']: 
    for column in ['foobar1', 'foobar2']: 
     cursor.execute('select %s from %s' % (column, table)) 
     exec "%s_%s = cursor.fetchall()" % (table, column) 

cursor.close() 

conn.commit() 
conn.close() 

Y at-il une fonctionnalité intégrée à Django pour itérer plus facilement à travers les valeurs d'une colonne dans une table de base de données ? J'ai affaire à des millions de lignes, donc la vitesse d'exécution est importante.

[RESOLU] Merci à tous. J'ai utilisé l'itérateur intégré, combiné avec l'appel à values_list() pour l'optimisation des performances. Notez que l'appel de values ​​() retournera des dicts, qui sont lents à parcourir, alors que values_list() retourne des tuples beaucoup plus rapides. Ainsi, par exemple, si je veux itérer sur chaque ligne de la colonne « foobar1 », dans la table « foo », je peux obtenir un itérateur de la manière suivante:

foobar1_iterator = foo.objects.values_list('foobar1').iterator() 

Supposons que je veux itérer i pour produire une liste de toutes les valeurs de ligne de 'foobar1'. Puis simplement faire ceci:

foobar1_list = [i for i in foobar1_iterator] 

Répondre

1
from django.db.models.loading import get_model 
app_name = 'your_app_name' 
for model_name in ['foo','bar']: 
    model = get_model(app_name, model_name) 
    model_values = model.objects.values('foorbar1','foobar2') # this is a ValuesQuerySet. 
                   # you can run your computation on it, 
                   # or store the values somewhere. 
1

Database microoptimalisation ne fait pas partie forte de Django ORM. Cependant, quand la vitesse est si importante, je me demande si l'exec est la bonne façon de le faire.

Quoi qu'il en soit, vous écrivez "parcourir les valeurs d'une colonne", cela signifie que vous avez plusieurs valeurs dans une seule colonne séparées par un séparateur (pas vu dans votre code)?

Ensuite, il suffit

for value in modelinstalnce.column.split('seprator'): 
    print 'whatever' 

En ce qui concerne la connexion, il est préférable d'utiliser

from django.db import connection 

au lieu de le faire à la main.

En ce qui concerne les paires, je ferais quelque chose comme:

pairs = [] 

for model in (MyModel, MyModel2,): 
    for field in model.field_names: 
     pairs.append((field, getattr(model, field)) 
Questions connexes