【问题标题】:Django Foreign key in another database另一个数据库中的Django外键
【发布时间】:2016-10-17 03:18:51
【问题描述】:

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

由于 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'")

【问题讨论】:

    标签: mysql django foreign-keys multiple-databases


    【解决方案1】:

    一个或两个数据库?

    首先要问自己的问题是真的有必要拥有两个不同的数据库吗?使用同一个数据库的多个应用程序在 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

    如果您希望这些步骤可重现,则需要手动添加迁移。

    【讨论】:

    • 感谢您的精彩回答!我不知道多个应用程序使用同一个数据库是很常见的,我认为这样做是一种不好的做法。所以,当你给我两个选项时,我将使用第一个,它肯定更实用。干杯!
    • 很高兴帮助了 PHP 世界,他们通常将应用程序名称添加到表中。例如,最受欢迎的 php 应用程序 wordpress,所有表格都以 wp_ 开头
    • 几乎忘记了 django 会自动为每个表名添加应用程序名称的前缀。如果有两个同名的应用程序,您只会遇到麻烦。即使这样 Meta: db_table 设置也可以克服这一点。
    【解决方案2】:

    我认为这个问题与 django 无关。按照设计,DBMS 不允许在数据库之间进行 FK。也许您可以在 Internet 上找到一些解决方法,但它们可能不遵守最佳做法。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多