Django外键在另一个数据库中

时间:2016-06-15 20:23:00

标签: mysql django foreign-keys multiple-databases

我有两个独立的Django应用程序,有两个不同的数据库。在APP1中,我需要来自APP2 DB中一个表的所有记录。除此之外,我的一个APP1模型有一个指向APP2模型的ForeignKey,根据文档,这是不可能的。

由于Django不支持跨多个数据库的外键关系,因此我不知道该怎么做。

官方文档:

  

如果您使用路由器将模型分区到不同的数据库,   由这些模型定义的任何外键和多对多关系   必须是单个数据库的内部。

     

这是因为参照完整性。为了维持一个   两个对象之间的关系,Django需要知道的   相关对象的主键有效。如果主键是   存储在单独的数据库中,无法轻松评估   主键的有效性。

作为一种解决方案,我曾考虑合并这两个数据库,因此这两个APPS将使用同一个数据库。但是后来我会对模型造成混乱,因为APP1只需要APP2中的一个表,并且它不需要剩余的模型和数据库表。此外,我非常确定在将这两个应用程序迁移到同一个数据库时会产生问题(冲突)。

我使用的是Django DB路由器,这是我迄今为止尝试过的:

class Car(models.Model):
    _DATABASE = "cars"
    color = models.TextField(max_length=1000)
    ...

class Employee(models.Model):
    id = models.IntegerField()
    car = models.ForeignKey(Car)
    ...

它给了我:

django.db.utils.OperationalError: (1054, "Unknow column 'car' in 'employees'")

2 个答案:

答案 0 :(得分:1)

我认为这个问题与django无关。根据设计,DBMS不允许数据库之间的FK。也许你可以在互联网上找到一些解决方法,但可能他们不遵守最佳实践。

检查跨数据库关系部分: https://docs.djangoproject.com/en/1.9/topics/db/multi-db/

答案 1 :(得分:1)

一个DB或两个?

问自己的第一个问题是否真的有必要拥有两个不同的数据库?在PHP世界中,使用相同数据库的多个应用程序非常常见,大多数人都在共享托管,托管计划只允许一个数据库。

网站有足够的流量来分割两个数据库之间的内容是非常罕见的。而且通常路由器的头部使它不值得。使用专业软件几乎总能更好地处理分片。

是的,它必须是两个!

这不是不可能的,只是努力学习。

要做的第一件事就是更改Car模型

class Car(models.Model):
    color = models.TextField(max_length=1000)
    class Meta:
        managed = False

请注意,它不再引用第二个数据库,而且它不受管理。但是,您的数据库中没有这样的表格。所以你需要create a view

 CREATE OR REPLACE VIEW myapp_cars AS SELECT * FROM cars.otherapp_cars

请确保使用确切的数据库和表名称以匹配现有的名称。我们只有一半。您需要创建一个触发器以插入另一个数据库。这之前已经讨论了很多次,所以我不会详细说明。实例

  1. MySQL Trigger to insert data into different DB
  2. How to create trigger to insert data to a database on another server
  3. 如果您希望这些步骤可以重现,则需要手动添加迁移。