Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在Django中连接来自两个不同数据库的两个表?_Sql Server_Django_Django Models_Django Orm - Fatal编程技术网

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

Sql server 如何在Django中连接来自两个不同数据库的两个表?,sql-server,django,django-models,django-orm,Sql Server,Django,Django Models,Django Orm,在我的一个项目中,我遇到了将Django中不同数据库中的两个表连接在一起的需求,但还不能找到最佳解决方案。问题是我有两个数据库,其中的表相互关联,我想在两个不同数据库的表之间建立连接SQL查询在MS SQL Server中运行良好,但在Django中如何做到这一点是主要问题。我想在Django内部运行RawSQL查询,并将其传递给ORM。对于单个数据库来说,这是可以的,但是对于两个数据库来说,它不起作用 例如,我有两个数据库,比如带有表CashAccount的DB1和带有表teamAccount

在我的一个项目中,我遇到了将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查询?

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

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

classdbrouter(object):def db_for_read(self,model,**提示):“指定哪种模型使用哪种数据库写入”“,如果模型位于[Industry,Verticals]:返回“database-a”

更新设置文件以使用自定义路由器
DATABASE\u ROUTERS=['your\u app.db\u ROUTERS.DBRouter']

然后您可以使用如下代码:

banana=TableB.objects.get(pk=1)

queryset=TableA.objects.using('db-a').all()


queryset=queryset.using('db-b').filter(foreign\u key\u col\u a=banana)
我认为上述答案是一个很好的答案,但还有一个更复杂的解决方案

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

classdbrouter(object):def db_for_read(self,model,**提示):“指定哪种模型使用哪种数据库写入”“,如果模型位于[Industry,Verticals]:返回“database-a”

更新设置文件以使用自定义路由器
DATABASE\u ROUTERS=['your\u app.db\u ROUTERS.DBRouter']

然后您可以使用如下代码:

banana=TableB.objects.get(pk=1)

queryset=TableA.objects.using('db-a').all()


queryset=queryset.using('db-b').filter(foreign\u key\u col\u a=banana)
?这回答了你的问题吗?