【问题标题】:Iterating over a database column in Django迭代Django中的数据库列
【发布时间】:2011-02-05 10:06:57
【问题描述】:

我想对 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]

【问题讨论】:

    标签: python mysql database django


    【解决方案1】:
    【解决方案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))
    

    【讨论】:

      【解决方案3】:
      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.
      

      【讨论】:

        猜你喜欢
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 2018-11-04
        • 2013-05-25
        相关资源
        最近更新 更多