繁体   English   中英

如何连接 Django 中来自两个不同数据库的两个表?

[英]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() 执行此查询?

我认为上面的答案是一个很好的答案,但还有一个更复杂的解决方案。

  • Django 希望您通过创建 model 然后运行迁移命令来创建/更新您选择的数据库中的表来创建数据库。 如果你这样做,一切都将在同一个数据库中,你不会有这个问题。
  • 我想更多地组织我的数据库,所以我手动创建它们,团队成员创建了一个自定义路由器来指示要使用的数据库。

定制路由器 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM