迭代Django中的数据库列

时间:2010-04-07 19:30:17

标签: python mysql database django

我想在MySQL数据库中对一列值进行迭代计算。我想知道Django是否有任何内置功能来执行此操作。以前,我刚刚使用以下内容将每个列存储为名为table_column的元组列表:

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()将返回dicts,迭代缓慢,而values_list()返回更快的元组。因此,例如,如果我想迭代列'foobar1'的每一行,在表'foo'中,我可以通过以下方式获取迭代器:

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

假设我想迭代i来生成'foobar1'的所有行值的列表。然后只需这样做:

foobar1_list = [i for i in foobar1_iterator]

3 个答案:

答案 0 :(得分: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 :(得分:1)

数据库微优化不是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))

答案 2 :(得分:1)