Django:无需迁移即可初始化数据库

Django : initialize database without migrations

抱歉,我是 Django 的新手。我已经有点注意了,但完全缺乏经验。 所以这些问题听起来很愚蠢,但我无法以这种一般形式找到它。 所以... 比方说,我已经有人完成了一些 Django 项目。现在我有两种情况:

  1. 我有最新版本的项目代码。但我对数据库一无所知:既不是数据库,也不是迁移。 举个例子,代码在某个 Git 上,但是数据库和迁移文件在某个服务器上,而这个服务器丢失了。

我想知道我是否仍然可以从零开始初始化项目?

获取数据库为空的新服务器。我克隆了项目的 git 代码。启动

manage.py makemigrations
manage.py migrate

然后我将获得由我们的模型文件初始化的新数据库?

是否正确? 它有什么陷阱吗?

  1. 第二种情况类似,但不完全相同。

现在我有一些数据库转储和一些迁移。但可能不是全部。

所以我不知道我的代码与转储和迁移有多少不同。 我已经看到有关类似情况的问题。似乎在全球范围内解决方案是这样的:

manage.py makemigrations
manage.py migrate --fake

manage.py makemigrations
manage.py migrate

可能我需要在“伪造”之前修改(删除)一些迁移文件 运行 或做一些其他的技巧......但在全球范围内这是方法。

是否正确?

Django 版本对这个问题很重要。没有这么说 - 对于这个答案 - 假设至少是 1.7 或更高到当前。

预先:从中吸取教训并开始将迁移文件作为代码的一部分提交以避免这种情况。尽管这些文件大部分时间是自动生成的,但它们应该是代码库的一部分。

1。在没有迁移文件的情况下从头开始初始化

你的假设是正确的。以下是更多详细信息:

  1. 创建数据库。数据库名称应在 settings.py(或 settings/base.py 或类似)文件中说明。对于 postgres,您可以从 shell.
  2. 运行 $ createdb name_of_db
  3. 运行./manage.py makemigrations。这应该会在您的所有应用程序中创建 migrations 个目录和文件。如果没有新文件,运行 明确说明应用程序的命令,如 ./manage.py makemigrations my_app。关于如何指定应用程序,请参阅此命令的帮助。
  4. 运行./manage.py migrate。这应该会在您在步骤 1 中创建的数据库中创建所有必要的 table 和约束。

2。在没有迁移文件的情况下获取转储工作

有两种情况,具体取决于您所处的情况。

2.1 转储是最新的,代码也是如此

这意味着数据库的版本与您的代码版本一致,您只是缺少迁移文件。

在这种情况下:

  1. 从一个空数据库开始,然后按照上述步骤(第 1 部分)进行操作。
  2. 然后将转储加载到数据库中。
  3. 可选:如果需要,您可以查看数据库中的 table django_migrations 并清空它。
  4. 运行 ./manage.py migrate --fake

2.2 转储与代码库不一致

您可以尝试2.1中的步骤。系统可能会通过警告和错误告诉您数据库和迁移转向的位置。您可以尝试更改转储,直到一切 运行s.

您还可以使用 inspectdb 查看 table 和模型之间的差异。

或者您可以尝试以下操作:

  1. 将转储加载到 django 使用的数据库中
  2. 使用 dumpdata 命令将数据转储到固定装置中。
  3. 删除并重新创建数据库,使其为空。
  4. 创建新的迁移并运行它们(参见上面的第 1 部分)
  5. 使用loaddata命令加载灯具

这样您就可以确保数据库(尤其是约束)与 Django 代码保持一致。