代码之家  ›  专栏  ›  技术社区  ›  arne.b

Django。保存(使用=“…”)正确的数据库名称

  •  1
  • arne.b  · 技术社区  · 8 年前

    我的Django设置。py包含以下内容:

    DATABASES = {
        'default': { # several settings omitted
                   'NAME': 'myproject', 'HOST': 'localhost', },
        'other': { 'NAME': 'other', 'HOST': 'else.where', }
    }
    

    我现在想从 另外 DB并将其保存到 违约 像这样:

    things = Thing.objects.using('other').raw('SELECT code,created FROM other.otherapp_bigthing WHERE created>...')
    # 'code' is a unique string in other and PK of the Thing model
    for t in things:
         t.save(using='default')
    

    这让我

    ProgrammingError: (1146, "Table 'other.myapp_thing' doesn't exist")
    

    然而,这是一个正确的观察结果 documentation of the using parameter 我希望记录保存到 myproject.myapp_thing . 为什么数据库名称仍然取自 other 当我明确建议使用 default ?

    1 回复  |  直到 8 年前
        1
  •  0
  •   arne.b    8 年前

    我最终通过制作一个原始插入物来解决这个问题( connections['default'].cursor().execute('INSERT INTO myproject.myapp_thing (...) ON DUPLICATE KEY UPDATE...') 但仍然想知道为什么问题的代码不起作用。

    问题是 Thing 模型包含另一个字段:位于 code 查菲尔德/PK和 created 日期(实际上在我的用例中 last_accessed )还有另一个约会(想想 modified )使用 default=None, null=True 我假设如果我没有显式地包含在原始查询中,将使用默认值。

    显然,这个假设是错误的,Django试着 t.save ,以查找 被改进的 在DB中,它最初来自—但失败了,因为它来自原始SQL查询。

    如果我包括 ,NULL AS 'modified' 在原始SQL查询中,原始错误消失了 但我仍然无法合理地将Django逻辑用于我的用例,因为 t.save(using='default') 会对现有的东西进行更新 上次访问的\u 和 覆盖 被改进的 日期为NULL,我不想要,并且 t.save(using='default', update_fields=['last_accessed']) 将 force an update 因此在新事物上失败了 .