【问题标题】:Django : initialize database without migrationsDjango:在没有迁移的情况下初始化数据库
【发布时间】:2023-03-25 06:34:02
【问题描述】:

对不起,我是 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 django-models django-migrations


    【解决方案1】:

    Django 版本对这个问题很重要。没有这样说明 - 对于这个答案 - 假设它至少为 1.7 或更高。

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

    1。无需迁移文件从头开始初始化

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

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

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

    有两种情况,取决于你在哪一种。

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

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

    在这种情况下:

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

    2.2 转储未与代码库对齐

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

    您也可以使用inspectdb 来检查表格和模型之间的差异。

    您也可以尝试以下方法:

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

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

    【讨论】:

    • 非常感谢您非常完整的回复。非常欣赏不同的用例场景。
    • 关于版本。我没有精确,因为我的问题更笼统。它与我从事的实际项目有一些联系,但实际项目的情况更为复杂。所以我问了一般性问题,以确保我正确理解了 Django 的基础知识。尽管如此,真正的项目是在 Django 2.2 上,所以我可以使用你的建议。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2013-04-08
    • 2022-07-01
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多