我的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
配置?
答案 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
日期,这是我不想要的,而modified
会force an update因为新事物而失败