Django:如何使用多个数据库?

Django : how to use multiple databases?

我正在使用 Django 构建一个网站,我的 User 模型中需要一个 GPS 坐标属性。

我将使用需要 PostgreSQL 的 GeoDjango,并且由于我的网站已经在使用 sqlite3 默认数据库,所以我需要在项目中安装 PostgreSQL 数据库以便在中创建 Coordinates 模型它和 link 它到 SQLite 数据库的 User 模型。

我在互联网上找到了很多关于 "how to use multiple databases" 的教程,但它们都是非常基础的。因为我对 Django 和网络编程还很陌生,所以我需要一个关于多个数据库的深入教程。我有几个问题,如果您能回答其中一个或多个问题,我将提前感谢您!

注意:我正在使用 windows 10 和安装了 windows 的 ubuntu 应用程序的 PostgreSQL。

1) 如何在Django 项目中为新数据库创建和初始化文件?文件 db.sqlite3 是在 Django 项目初始化时自动创建的,所以我如何创建另一个文件?

2) 我需要为 GPS 坐标使用新的应用程序还是可以使用现有的应用程序?

3) 如何在我的 User 模型和将在其他数据库中的 Coordinates 模型之间建立 OneToOne 关系?

您不能只创建一个数据库文件。除了 SQL lite 是一个非常基础的数据库,不能在生产中使用,其他数据库通常带有嵌入式服务器,并且没有您可以看到的文件。 你实际上可以使用多个数据库,或者你在不同的应用程序中有模型,或者你需要一些特定的表在另一个数据库中。但是Django不支持跨库关系!

查看此处了解更多信息:

正如@NalinDobhal 在评论中提到的:

Cross-database relations

Django doesn’t currently provide any support for foreign key or many-to-many relationships spanning multiple databases. If you have used a router to partition models to different databases, any foreign key and many-to-many relationships defined by those models must be internal to a single database.

据我所知,您有 2 个选择:

  1. 安装 SpatiaLite and continue using SQLite for your project, enabling spatial types in your existing DB (follow the documented GeoDjango Instructions on the matter)
  2. 首选解决方案:将现有的 SQLite 数据库迁移到 PostgreSQL 并启用 PostGIS。您可以很好地阅读为什么这是首选以及如何通过 Django 正确地进行迁移 in this article

首选流程的长话短说:

  • 对现有数据库进行数据库转储:

    python manage.py dumpdata > datadump.json
    
  • 进入DjangoShell并删除已有的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 特定的,而且几乎可以用于数据库之间的所有迁移(我知道的 ATM)。