Django模型与外部DB

时间:2015-01-02 12:45:02

标签: python django

我有一个典型的Django项目,其中包含一个主数据库,我可以保存所需的所有数据。

假设某个地方有另一个数据库,其中包含一些其他信息。该DB与我的Django项目没有直接关系,所以让我们假设我甚至没有控制权。

问题是我确实知道是否需要为这个外部数据库创建和维护模型,所以我可以使用Django的ORM。或者最好的解决方案是使用原始SQL从外部数据库获取数据,然后使用此ifo使用ORM从主数据库中过滤数据,或者直接在视图中过滤数据。

创建模型的解决方案似乎相当不错,但DB不是我项目的一部分,这意味着我不知道可能的架构变化,看起来它是一个不好的做法。 / p>

所以最后如果我有一些外部资源,比如与我的项目无关但需要的DB,我应该:

  • 尝试为他们创建django模型
  • 使用原始SQL从外部数据库获取信息,然后使用它通过ORM过滤来自主数据库的数据,并在需要时直接在视图中使用数据
  • 将原始SQL用于主应用程序和外部数据库,它们在应用程序的逻辑中相交

3 个答案:

答案 0 :(得分:2)

另一种方法是将SQLAlchemy用于外部数据库。它可以使用reflection在运行时生成SQLAlchemy等效的django模型。

它仍然不会没有问题。如果您的代码依赖于某个列,那么如果以不兼容的方式删除或更改该列,它仍会中断。但是,它会为您的数据库交互添加更多灵活性,例如如果int列更改为varchar列,Django模型肯定会中断,但使用数据库反射,只有当您的代码依赖于它是int这一事实时,它才会中断。如果您只是显示数据或其他内容,它将保持完全正常运行。但是,更改不会破坏系统,但会导致意外行为。

如果像Benjamin说的那样,外部系统有一个API,那将是首选。

答案 1 :(得分:0)

我建议您阅读有关inspectdb和数据库路由器的信息。可以使用django ORM来操作外部DB。 https://docs.djangoproject.com/en/1.7/ref/django-admin/#inspectdb

答案 2 :(得分:0)

我会在外部数据库上创建最小的django模型=>与您的代码互动的那些:

对此有几个结果

  1. 如果您对数据库的某些部分不感兴趣,则不会对您的应用产生任何影响。
  2. 如果外部模型使用您的更改,您可能希望尽快知道(在这种情况下您的应用可能会中断)。
  3. 代码中的所有关系数据库查询都由同一个ORM处理。