在Django中使用多个数据库,让另一个数据库包含任何模型都不创建的表

时间:2019-07-09 04:05:47

标签: python django postgresql django-models

这是我的问题,如果您想知道详细信息,请在下面进一步提及(很长的帖子,很抱歉,我希望查询尽可能详细):

问题

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

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


因此,我们试图通过远程数据库Cross-database referencing强制实施my_remote_db,该数据库包含不是Django模型创建的表。

我们已经阅读了Django文档,告诉它当前无法处理这种引用方法,但是我们可以在settings.py中定义多个数据库这一事实使我们对存在某种解决方法感到乐观。

我们的settings.py

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

enter image description here

我们要实现的目标:

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

示例用法:

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

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

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

PS

我们尝试在python shell中运行以下命令,我们将获得

  

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操作。远程数据库不是旧版数据库。

2 个答案:

答案 0 :(得分:0)

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

  1. 连接外部数据库

  2. 使用inspectdb

  3. 反向工程远程模型
  4. migrate创建其他django表,例如权限

签出official django docs与之相处。

答案 1 :(得分:0)

深入研究后,我能够找到解决方案。如果仅我们的远程数据库是旧版,而不是inspectdb,则本来可以解决。因此,我们再次浏览了DB router指南,它解决了该问题。然后,我们可以按照doc直接执行自定义SQL,从而将数据从远程数据库传递到Django应用中。

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