Django .save(使用=' ...')正确的数据库名称

时间:2018-01-04 13:03:30

标签: django

我的Django settings.py包含以下内容:

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

我现在想从其他数据库中获取一些对象并将其保存到 default ,如下所示:

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 个答案:

答案 0 :(得分:0)

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

问题是Thing模型包含另一个字段:code CharField / PK和created日期旁边(在我的用例中实际为last_accessed)使用modified的另一个日期(想象default=None, null=True)我假设如果我没有在原始原始查询中明确包含,则会使用默认值。

显然,这个假设是错误的,Django在t.save上试图在它最初来自的数据库中查找modified的值 - 并且失败了,因为它来自原始SQL查询。

如果我在原始SQL查询中包含,NULL AS 'modified'原始错误消失了但我仍然不能合理地将Django逻辑用于我的用例,因为t.save(using='default')对于现有的事情,更新{ {1}} 用NULL覆盖last_accessed日期,这是我不想要的,而modifiedforce an update因为新事物而失败