Django:如何使用多个数据库?
Posted
技术标签:
【中文标题】Django:如何使用多个数据库?【英文标题】:Django : how to use multiple databases? 【发布时间】:2020-05-08 13:45:37 【问题描述】:我正在使用 Django 构建一个网站,我需要在我的 User
模型中具有 GPS 坐标属性。
我将使用 GeoDjango,它需要 PostgreSQL,并且由于我的网站已经在使用 sqlite3 默认数据库,我需要在项目中安装一个 PostgreSQL 数据库,以便在其中创建一个 Coordinates
模型并链接它到 SQLite 数据库的User
模型。
我在网上找到了很多关于“如何使用多个数据库”的教程,但它们都是非常基础的。由于我对 Django 和 Web 编程还很陌生,因此我需要有关多个数据库的深入教程。我有几个问题,如果您能回答其中的一个或多个问题,我提前感谢您!
注意:我使用的是安装了 PostgreSQL 的 windows 10 和 windows 的 ubuntu 应用程序。
1) 如何在 Django 项目中为新数据库创建和初始化文件?文件 db.sqlite3 是在 Django 项目初始化时自动创建的,那么如何创建另一个文件呢?
2) 我需要使用新的应用程序来获取 GPS 坐标还是可以使用现有的应用程序?
3) 如何在我的User
模型和将在另一个数据库中的Coordinates
模型之间建立OneToOne
关系?
【问题讨论】:
我会回答第三个:Django 不支持cross DB relations。 @NalinDobhal 那么你对如何达到我的目的有什么建议吗?我希望除了删除所有内容并仅使用 postgreSQL 数据库重建项目之外,还有其他解决方案 您不必删除任何内容。只需将现有数据迁移到 PostgreSQL。它通常是这样做的,您可以找到很多关于如何做到这一点的信息。现在的一个小不便将使您免于使用多个数据库引擎带来的所有限制和复杂性。 @KevinChristopherHenry 谢谢,我想我会这样做的! @JulienMertz sqlite 无论如何都不适合生产。 【参考方案1】:正如@NalinDobhal 在 cmets 中提到的:
Cross-database relations
Django 目前不支持跨多个数据库的外键或多对多关系。 如果您使用路由器将模型分区到不同的数据库,则任何外键和许多这些模型定义的多对多关系必须在单个数据库内部。
在我看来,您有两个选择:
-
安装 SpatiaLite 并继续为您的项目使用 SQLite,在现有数据库中启用空间类型 (follow the documented GeoDjango Instructions on the matter)
首选解决方案:将现有 SQLite DB 迁移到 PostgreSQL 并启用 PostGIS。您可以通过 Django in this article 很好地了解为什么这是首选以及如何正确进行迁移。
首选流程的长话短说:
对现有数据库进行数据库转储:
python manage.py dumpdata > datadump.json
进入Django Shell,删除已有的ContentType
数据
python manage.py shell
>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().delete()
>>> quit()
将转储文件加载到 PostgreSQL 数据库中:
python manage.py loaddata datadump.json
注意:这个迁移过程不仅是 SQLite 到 PostgreSQL 的特定过程,而且可以用于几乎所有 DB 之间的迁移(我知道 ATM)。
【讨论】:
【参考方案2】:您不能只创建一个数据库文件。除了 SQL lite 是一个非常基础的数据库并且不能在生产中使用之外,其他数据库通常带有嵌入式服务器并且没有您可以看到的文件。 您实际上可以使用多个数据库,或者您在不同的应用程序中有模型,或者您需要一些特定的表才能在另一个数据库中。但是Django不支持跨库关系!
查看这里了解更多信息:
Django 1.11 can we create relationship between tables from two different databases?
【讨论】:
以上是关于Django:如何使用多个数据库?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Django 获取特定的 id 数据(多个 id 存储在列表中)
如果在 django 中使用多个数据库,如何仅迁移所需的模型表