[英]How to Join two tables from two different databases in Django?
在我的一个项目中,我遇到了在 Django 中连接来自不同数据库的两个表的要求,但还没有找到最佳解决方案。 问题是我有两个数据库,其中的表相互关联,我想在两个不同数据库的表之间进行连接。 SQL 查询在 MS SQL 服务器内部运行良好,但主要问题是如何在 Django 中执行此操作。 我想在 Django 内运行 RawSQL 查询并将其传递给 ORM 。 对于单个数据库,它很好,但对于两个数据库,它不起作用。
例如,我有两个数据库,如带有表 CashAccount 的 DB1 和带有表 teamAccount 的 DB2。
SQL Query:
SELECT (t1.unique_name) as unique_name,
(t1.AccountBalanceAmount) AS AccountBalanceAmount,
(t2.TeamName) AS TeamName,
(t2.ProjectDesc) AS ProjectDesc,
FROM (
SELECT CONCAT(ID,'_',ProjectName) AS unique_name,
AccountBalanceAmount
FROM DB1.CashAccount
) t1
INNER JOIN (
SELECT CONCAT(ID,'_',ProjectName) AS unique_name,
TeamName
ProjectDesc
FROM DB2.TeamAccount
) t2 ON t1.unique_name = t2.unique_name
如何使用 Django ORM 或原始 SQL Query using raw() 执行此查询?
我认为上面的答案是一个很好的答案,但还有一个更复杂的解决方案。
定制路由器 class:
class DBRouter(object): def db_for_read(self, model, **hints): """ specify what model uses what db to write """ if model in [ Industry, Verticals ]: return 'database-a'
...
更新设置文件以使用您的自定义路由器DATABASE_ROUTERS = ['your_app.db_routers.DBRouter']
然后你可以使用如下代码:
banana = TableB.objects.get(pk=1)
queryset = TableA.objects.using('db-a').all()
queryset = queryset.using('db-b').filter(foreign_key_col_a=banana)
使用 Django 的Manager.raw
执行 SQL 应该在一个数据库服务器中跨两个不同的工作正常,只需确保结果列包含 ORM model 的主键。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.