2010-04-07 41 views
0

我想對MySQL數據庫中的一列值進行迭代計算。我想知道Django是否有任何內置的功能來做到這一點。以前,我剛纔用下面的每一列存儲爲元組的名爲table_column列表:在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() 

有沒有內置Django的任何功能,通過一列的值在數據庫表更方便迭代?我正在處理數百萬行,因此執行速度非常重要。

[已解決]謝謝大家。我使用內置的迭代器,並結合values_list()調用進行性能優化。請注意,調用values()將返回迭代較慢的字典,而values_list()會返回更快的元組。因此,舉例來說,如果我想列「foobar1」的每一行遍歷,表中的「富」,我可以通過以下方式獲得的迭代器:

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

假設我要遍歷我要生成'foobar1'的所有行值的列表。然後,只需做到這一點:

foobar1_list = [i for i in foobar1_iterator] 

回答

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

數據庫microoptimalisation不是Django的ORM的強有力的作用。但是,當速度如此重要時,我想知道高管是否是正確的做法。

不管怎麼說,你寫的是「遍歷一個列的值」,這意味着你有多個值在單獨的列中用分隔符分開(在你的代碼中看不到)?

然後,只需

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

至於連接,它更好地使用

from django.db import connection 

,而不是手工做的。

至於對,我會做一些事情,如:

pairs = [] 

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