在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()会返回字典,这样遍历起来比较慢,而values_list()返回的元组则快得多。所以,比如说,如果我想遍历表'foo'中'foobar1'这一列的每一行,我可以这样获得一个迭代器:
foobar1_iterator = foo.objects.values_list('foobar1').iterator()
假设我想遍历i,生成'foobar1'所有行的值列表。那么只需这样做:
foobar1_list = [i for i in foobar1_iterator]
3 个回答
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.
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。
2
数据库的微优化在Django的ORM中并不是特别强。不过,当速度非常重要的时候,我在想使用exec是不是合适的方法。
另外,你提到“遍历一个列的值”,这意味着你在一个列中有多个值,用某种分隔符分开(在你的代码中没有看到这个)?
那么只需要这样做:
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))
1
可以查看Django的文档,了解only()和iterator()这两个功能:
http://docs.djangoproject.com/en/1.1/ref/models/querysets/#only-fields
http://docs.djangoproject.com/en/1.1/ref/models/querysets/#iterator