(我知道有一个与此相同的标题,但问题不同)。
我设法让我的开发机器迁移和生产迁移不同步。
我有一个使用South的Django应用程序。我有自己的工作流程很好(它可能不是正确的做事方式,但我没有遇到任何问题)。
基本上我有一个脚本可以将生产数据库转储复制到我的开发机器上。它还复制了迁移文件。这样两者是同步的,我可以照常运行南方命令。
现在我已升级到1.7,并开始使用迁移。当我使用以前的工作流程(复制数据库转储和生产中的迁移文件)时,它不会检测我的开发计算机上的更改。
我已经阅读了迁移文档,我发现使用它的正确方法是
反正。现在一切都搞得一团糟。我想"重置"我的迁移,从头开始,从现在开始正确地做事。
我需要做什么?
我错过了什么吗? 有没有理由为什么从生产中复制所有内容(数据库和迁移文件)之后我的开发机器上没有检测到任何更改
答案 0 :(得分:51)
我只会在两种环境中执行以下操作(只要代码相同)
<your app name>
。你也可以截断这个表。python manage.py makemigrations
python manage.py migrate --fake
在此之后,应该跨环境检测所有更改。
答案 1 :(得分:28)
运行
python manage.py migrate your_app zero
这将从your_app
中删除所有表格如果您愿意,既然您说要重新开始,可以删除迁移文件夹,或者重命名文件夹,创建新的迁移文件夹并运行
python manage.py makemigrations your_app
python manage.py migrate your_app
就像南方一样,你总能来回走动......
# Go to the first migration
python manage.py migrate your_app 0001
# Go to the third migration
python manage.py migrate your_app 0003
所以想象你的第四次迁移是一团糟......你可以随时迁移到第三次,删除第四次迁移文件并再次执行。
注意:强>
这是您的模型应该在不同应用中的原因之一。假设您有2个型号:用户和注意。创建2个应用程序是一个很好的做法:用户和备注,以便迁移彼此独立。
尽量不要为所有模型使用单个应用程序
答案 2 :(得分:16)
harshil答案的一个小变化:
$ manage.py migrate --fake <appname> zero
$ rm -rf migrations
$ manage.py makemigrations <appname>
$ manage.py migrate --fake <appname>
这将...
答案 3 :(得分:2)
要重置所有迁移并重新开始,您可以运行以下命令:
python manage.py migrate <app_name> zero
ℹ️ 如果这给您带来了问题,您可以在命令末尾添加 --fake
标志。
python manage.py makemigrations <app_name>
ℹ️ 仅当您删除或更改迁移文件时才执行此步骤
python manage.py migrate <app_name>
⚠️ 如果您将 --fake
命令添加到第 1 步,则需要将 --fake-initial
添加到 migrate 命令,因此 python manage.py migrate <app_name> --fake-initial
答案 4 :(得分:1)
如果您想完全重置数据库和架构,则将代码放在这样的任何应用程序中
app / management / commands / resetdb.py
import os
import glob
import shutil
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
from django.db import connection
class Command(BaseCommand):
help = 'Resets the database'
def handle(self, *args, **options):
dbname = settings.DATABASES["default"]["NAME"]
with connection.cursor() as cursor:
cursor.execute("DROP DATABASE %s" % dbname)
cursor.execute("CREATE DATABASE %s" % dbname)
base = str(settings.BASE_DIR)
migrations = glob.glob(os.path.join(base, "*", "migrations"))
for migration in migrations:
shutil.rmtree(migration)
apps = [migration.split("\\")[-2] for migration in migrations]
for app in apps:
os.system("python manage.py makemigrations %s" % app)
os.system("python manage.py migrate")
现在使用重置它:
python manage.py resetdb
这将
答案 5 :(得分:0)
1)
如果您使用的是Posgres或MySQL之类的数据库系统,并且拥有名为mydb的数据库,请先使用SQL语言删除数据库
delete mydb;
2)
接下来,您需要浏览属于您项目的每个应用程序的所有迁移文件夹,并删除除init.py之外的所有迁移文件
如果您在Linux / MAC下使用终端,则可以自动执行此繁琐的操作。例如
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
3)
接下来,最后要做的就是执行将模型与Django同步到新数据库时通常调用的两个迁移命令
python manage.py makemigrations
python manage.py migrate
如果使用的是sqlite以外的任何数据库系统,请确保在删除旧数据库之后创建了新数据库。
当您的应用因为无法删除数据库而投入生产时,在这种情况下如何重置迁移?
我们只需要在删除迁移历史记录的同时保留数据库。以下是详细步骤的实现方法:
1)
首先浏览每个应用并通过发出以下命令来确定其迁移历史记录
python manage.py migrate --fake myApp zero
Django将取消对特定应用(myApp)的所有先前迁移
2)
接下来,您需要实际删除迁移文件,因此您需要再次浏览每个应用程序迁移文件夹并删除它们(除了init.py之外)。只需在任何基于unix的操作系统下使用以下脚本即可。对于Windows,您可以使用power命令行。应该与unix相似,但是我真诚地不使用Windows和更强大的bash
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
您可以使用:
轻松地验证您的迁移python manage.py showmigrations
3)
接下来,我们需要再次创建迁移,因此只需执行
python manage.py makemigrations
但是请不要忘记数据库仍然具有属于初始迁移的表,因此我们需要做的是迁移数据库,同时伪造初始迁移,只需执行即可实现
python manage.py migrate --fake-initial
答案 6 :(得分:0)
所以这个解决方案今天对我有用。
拖放名为“ django_migrations”的django迁移表 (无需删除整个数据库-只需删除迁移表。)
从所有应用程序中删除所有迁移文件(例如0002_auto.py等),保留 init .py文件。您可以从Ahmed Bouchefra使用以下代码:
查找。 -path“ / migrations / .py”-不是-name“ init .py”-删除
查找。 -path“ / migrations / .pyc”-删除
(此查找和删除代码仅适用于linux。对于Windows,您必须手动删除文件。)
现在运行以下命令:
python manage.py makemigrations
python manage.py migration --fake
django将创建一个新的迁移表,并在不接触现有数据的情况下将初始迁移伪造到该表中。享受。
答案 7 :(得分:0)
我有一个与此类似的问题,但是当使用python manage.py showmigrations
测试这些相同的解决方案时,我注意到我遇到了相同的错误。
最终,我发现了这个post,这使我意识到我正在使事情变得过于复杂,并且本质上定义了两个用户模型。
答案 8 :(得分:0)
这对我有用
第一步:
删除所有应用中的所有“迁移”文件夹
第二步:
创建一个全新的应用程序。
python manage.py justTestApp
。
将新应用的新“migrations”文件夹复制到所有应用
第三步:
删除“db.sqlite3”文件。
删除“justTestApp”文件夹
第四步:
python manage.py makemigrations
python manage.py migrate