【问题标题】:Use multiple databases in Django having the other database contain tables not created by any model在 Django 中使用多个数据库,让另一个数据库包含不是由任何模型创建的表
【发布时间】:2019-07-09 04:05:47
【问题描述】:

这是我的问题,如果您想了解详细信息,请进一步参考以下内容(抱歉,帖子太长,我希望询问尽可能详细):

问题

  1. 是否可以从外部数据库中检索数据并在 Django 项目中使用这些数据,即使该数据库中的表不是作为模型创建的?如果是这样,实现这一目标的基本概念是什么。

  2. 如果不是,那么剩下的解决方法是使用与远程相同的数据库,并将 django 项目的所有模型保存到该数据库中的特定模式中?


所以我们试图用远程数据库my_remote_db 强制实现Cross-database referencing,其中包含不是由 Django 模型创建的表。

我们已阅读 Django 文档,告诉它目前无法处理此类引用方法,但我们可以在 settings.py 中定义多个数据库的事实使我们乐观地认为有某种解决方法。

我们的 settings.py 中定义的数据库

  • django_project_db - 主数据库(我们的 Django 项目用于其模型的数据库)
  • my_remote_db - 远程数据库。几个应用程序正在使用这个数据库,例如我们的 Scout 和 PHP 应用程序等。

我们想要实现的目标:

从远程数据库(表未创建为model)中检索数据,并在我们的 Django 项目中使用这些信息。

示例用法:

假设我们想在我们的 Django 项目中创建一个模型 LeaveRequest,其中包含一个名为 employee 的字段,其值是从远程数据库 my_remote_db.my_schema.employees 表中引用的员工的 id

在管理门户中,当添加新的休假请求时,我们希望 employee 字段是员工的下拉列表。

由于无法使用models.ForeignKey,因为远程数据库的表不是作为模型创建的,因此我们只想通过执行原始 SQL 命令预填充employee 字段并传递结果为choices[('value','text')} 例如employee = models.IntegerField(choices[('1','Leonard Hofstadter'),('2','Sheldon Cooper')]

附言

我们尝试在 python shell 中运行以下命令,我们会得到 ​​p>

NotSupportedError:未实现跨数据库引用: “my_remote_db.my_schema.employees”

from django.db import connection
with connection.cursor() as cursor:
    cursor.execute("SELECT first_name FROM my_remote_db.my_schema.employees WHERE id=1")
    row = cursor.fetchone()
    print(row)

附加说明:

远程数据库将与我们的其他应用程序一起使用,并将执行所有 CRUD 操作。远程数据库不是旧数据库。

【问题讨论】:

    标签: python django postgresql django-models


    【解决方案1】:

    深入挖掘后,我找到了解决方案。 inspectdb 如果只有我们的远程数据库是遗产,但它不是,那将是一种解决方法。因此,我们再次查看了解决问题的DB router 指南。然后,我们可以通过按照doc 直接执行自定义 SQL 来将远程数据库中的数据传送到我们的 Django 应用程序中。

    我们认为只有当您有另一个 Django 应用程序的数据库要在另一个 Django 应用程序中用作远程 DB 时,DB 路由器才适用。

    【讨论】:

    • 这里的解决方案很好。我会记住这种方法。
    【解决方案2】:

    您应该将外部数据库视为旧数据库。在这种情况下,您必须使用inspectdb 命令实现该数据库的模型。 路线图是:

    1. 连接外部数据库

    2. 使用inspectdb对远程模型进行逆向工程

    3. migrate 创建额外的 django 表,例如权限

    查看official django docs 与它相处。

    【讨论】:

    • 嗯,这实际上很棒,因为远程数据库是一个尚未使用的旧数据库或如上所述的“遗留”数据库。但问题是,我们的远程数据库目前也在与我们的其他应用程序一起开发,一旦它们都部署为实时使用,它们将与我们的 Django 项目一起使用。这是一个问题,因为每次更新表结构时我们都需要运行inspectdb 并遇到migration constraints
    • 另一个问题是,让我们说更多数据将被添加到远程 DB 中的 employees 表中,因为我们在 Django 应用程序中使用 inspectdb 引用该表然后执行迁移,然后我们会需要定期将该表的数据从远程同步到 Django 应用程序数据库。
    • 哦,我明白了。实际上,直接查询其他应用程序的数据库是一种不好的方法。我会考虑从其他应用程序创建一个 API 来检索记录。这样就可以保证系统的稳定性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多