【问题标题】:How to Join two tables from two different databases in Django?如何在 Django 中连接来自两个不同数据库的两个表?
【发布时间】:2020-11-05 00:38:11
【问题描述】:

在我的一个项目中我遇到了在 Django 中连接来自不同数据库的两个表的需求,但还没有找到最佳解决方案。问题是我有两个数据库,它们的表相互关联,我想在两个不同数据库的表之间建立连接。 SQL 查询在 MS SQL Server 中运行良好,但如何在 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 执行此查询或使用 raw() 执行原始 SQL 查询?

【问题讨论】:

标签: sql-server django django-models django-orm


【解决方案1】:

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

  • Django 希望您通过创建模型然后运行 ​​migrate 命令来创建/更新您选择的数据库中的表来创建数据库。如果您这样做,所有内容都将在同一个数据库中,您将不会遇到此问题。
  • 我想进一步组织我的数据库,所以我手动创建它们,并且团队成员创建了一个自定义路由器来指示要使用的数据库。

自定义路由器类:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    相关资源
    最近更新 更多