Get_or_create抛出不可调用的间歇性元组错误

时间:2014-05-28 10:57:13

标签: python django orm tuples

我正在使用get_or_create,因为我遍历CSV文件将其读入数据库。启用日志记录后,我使用对象,创建元组来记录它在日志文件中是如何相处的 - 所有这些都是大多数的时间,除了偶尔它会在'创建时抛出'tuple对象'不可调用' '由get_or_create返回的变量。它在它抛出的位置似乎并不一致 - 如果我在同一个文件上运行相同的代码,有时它会超过它并且工作正常,有时它会粘在(不同的)早期行的CSV上。

编辑:当我调用'created'时错误就会消失 - 例如,在logger.debug(office.name部分。

作为一种解决方法,我有一个小问题,作为'except'函数的一部分,重试相同的get_or_create。这个后备工作正在发挥作用,并且还没有例外(我的记录高达67k,并且它会产生不同的错误),但它是一个笨拙的工作,而且非常简单。我宁愿修复基本问题 - 感觉get_or_create是默默失败的,这意味着元组被破坏了,但我找不到任何证据;当然如果是这样的话,会抛出一个异常的(sp?)错误。 (没有重复会导致MultipleObjectsReturned,并且我无论如何都没有得到异常。)

Tl; dr - get_or_create可以99%的时间工作,并且如果我放弃后退,但不会以有用的方式失败。

建议热烈欢迎。

代码如下:

try:
    office, created = Office.objects.get_or_create(name=office_name)
    logger.debug(office)
    logger.debug(created)

    if created:
        logger.info("Office added to database:")
        logger.info(office.name)
    else:
        logger.info("Office already exists:")
        logger.info(office.name)
except: #catchall exception for now 
    logger.error("Could not create: %s", office_name)
    office, created = Office.objects.get_or_create(name=office_name)
    if created:
         logger.info("Office added to database:")
         logger.info(str(office.name))
    else:
         logger.info("Office already exists:")
         logger.info(str(office.name))
         return office
    return office

回溯(仅限日志,道歉):

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py", line 112, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/~/Django/OMS/core/views.py", line 28, in loadinitialstats
    load_stats_from_csv(location)
  File "/Users/~/Django/OMS/core/filehandling.py", line 139, in load_stats_from_csv
    home_office = fetch_or_create_office(row[2])
  File "/Users/~/Django/OMS/core/filehandling.py", line 13, in fetch_or_create_office
    logger.info(created)
TypeError: 'tuple' object is not callable

1 个答案:

答案 0 :(得分:1)

我认为你对这个问题的诊断是错误的。错误告诉您元组不是可调用的。记录某些内容并不意味着调用它,而created不是一个元组(它是一个bool)。

我怀疑你的代码中某处你不小心做了这样的事情:

logging.info = my_tuple

而不是

logging.info(my_tuple)

导致info从该点开始引用元组,而不是原始方法。