Django:在不迁移的情况下初始化数据库

Django:在不迁移的情况下初始化数据库,django,django-models,django-migrations,Django,Django Models,Django Migrations,对不起,我对Django很不熟悉。我已经注意到了一些,但完全缺乏经验。 因此,这些问题听起来很傻,但我无法找到这种一般形式的问题。 所以 比如说,我有一些Django项目已经有人完成了。现在我有两种情况: 我有最新版本的项目代码。但我对数据库一无所知:既没有数据库,也没有迁移。 举个例子,代码在某个Git上,但数据库和迁移文件在某个服务器上,此服务器丢失 我想知道我是否仍然可以从零开始初始化项目 获取数据库为空的新服务器。我克隆了项目的git代码。发射 manage.py makemigrati

对不起,我对Django很不熟悉。我已经注意到了一些,但完全缺乏经验。 因此,这些问题听起来很傻,但我无法找到这种一般形式的问题。 所以 比如说,我有一些Django项目已经有人完成了。现在我有两种情况:

  • 我有最新版本的项目代码。但我对数据库一无所知:既没有数据库,也没有迁移。 举个例子,代码在某个Git上,但数据库和迁移文件在某个服务器上,此服务器丢失
  • 我想知道我是否仍然可以从零开始初始化项目

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

    manage.py makemigrations
    manage.py migrate
    
    我会用我们的模型文件初始化新数据库

    对吗? 这有什么陷阱吗

  • 第二种情况类似,但并不完全相同
  • 现在我有一些数据库转储和一些迁移。但可能不是全部

    所以我不知道我的代码与转储和迁移有多大不同。 我已经看到了关于类似情况的问题。从全球来看,解决方案似乎是这样的:

    • 克隆代码;复制(或不复制)现有迁移
    • 创建新数据库并加载转储

    可能是我需要在“假”运行之前修改(删除)一些迁移文件,或者做一些其他操作。。。但在全球范围内,这是一种方法


    正确吗?

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

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

    1.从头开始初始化而不迁移文件 你的假设是正确的。详情如下:

  • 创建数据库。数据库名称应在settings.py(或settings/base.py或类似文件)中说明。对于postgres,您可以从shell运行
    $createdb name\u of_db
  • 运行
    /manage.py makemigrations
    。这将在所有应用程序中创建
    迁移
    目录和文件。如果没有新文件,请运行命令,并明确说明应用程序,如
    /manage.py makemigrations my_app
    。有关如何指定应用,请参阅此命令的帮助
  • 运行
    /manage.py migrate
    。这将在步骤1中创建的数据库中创建所有必要的表和约束
  • 2.让转储在没有迁移文件的情况下工作 有两种情况,取决于你处于哪一种情况

    2.1转储是最新的,代码也是最新的 这意味着数据库的版本与代码的版本一致,而您只是缺少迁移文件

    在这种情况下:

  • 从空数据库开始,按照上面的步骤操作(第1节)
  • 然后将转储加载到数据库中
  • 可选:您可以查看数据库中的表
    django_migrations
    ,如果需要,将其清空
  • 运行
    /manage.py migrate--false
  • 2.2转储未与代码库对齐 您可以尝试2.1中的步骤。系统可能会通过警告和错误告诉您数据库和迁移转移的位置。您可以尝试更改转储,直到所有内容都运行

    还可以使用检查表和模型之间的差异

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

  • 将转储加载到django使用的数据库中
  • 使用命令将数据转储到装置中
  • 删除并重新创建数据库,使其为空
  • 创建新的迁移并运行它们(请参见上面的第1节)
  • 使用命令加载设备

  • 通过这种方式,您可以确保数据库(尤其是约束)与Django代码保持一致。

    非常感谢您的完整响应。非常欣赏不同的用例场景。关于版本。我没有说得很精确,因为我的问题比较笼统。它与我从事的一个实际项目有一些联系,但实际项目的情况更为复杂。所以我问了一个一般性的问题,以确保我正确理解Django的基础知识。然而,真正的项目在Django 2.2上,因此我可以使用您的建议。:-)
    manage.py makemigrations
    manage.py migrate --fake
    
    manage.py makemigrations
    manage.py migrate