wob*_*col 30 migration django django-south django-migrations
(我知道有一个与此相同的标题,但问题不同).
我设法使我的开发机器迁移和生产迁移不同步.
我有一个使用South的Django应用程序.我有自己的工作流程,工作正常(这可能不是正确的做事方式,但我没有遇到任何问题).
基本上我有一个脚本将生产数据库转储复制到我的开发机器.它还复制了迁移文件.这样两者是同步的,我可以照常运行南方命令.
现在我已升级到1.7,并开始使用迁移.当我使用以前的工作流程(复制数据库转储和生产中的迁移文件)时,它不会检测我的开发计算机上的更改.
我已经阅读了迁移文档,我发现使用它的正确方法是
无论如何.现在一切都搞得一团糟.我想"重置"我的迁移并从头开始,从现在开始做正确的事情.
我需要做什么?
我错过了什么吗?是否有理由为什么从生产(数据库和迁移文件)复制所有内容后,我的开发机器上都没有检测到任何更改
小智 61
我会在两个环境中执行以下操作(只要代码相同)
<your app name>.您也可以截断此表.python manage.py makemigrationspython manage.py migrate --fake在此之后,应该跨环境检测所有更改.
bru*_*tas 35
跑
python manage.py migrate your_app zero
Run Code Online (Sandbox Code Playgroud)
这将从your_app中删除所有表
如果您愿意,既然您说要重新开始,可以删除迁移文件夹,或者重命名文件夹,创建新的迁移文件夹并运行
python manage.py makemigrations your_app
python manage.py migrate your_app
Run Code Online (Sandbox Code Playgroud)
就像南方一样,你总能来回走动......
# Go to the first migration
python manage.py migrate your_app 0001
# Go to the third migration
python manage.py migrate your_app 0003
Run Code Online (Sandbox Code Playgroud)
所以想象你的第四次迁移是一团糟......你总是可以迁移到第三次,删除第四次迁移文件并再次执行.
注意:
这是您的模型应该在不同的应用程序中的原因之一.假设您有2个型号:用户和注意.创建2个应用程序是一个很好的做法:用户和备注,以便迁移彼此独立.
尽量不要为所有模型使用单个应用程序
rra*_*nza 17
harshil答案的一个小变化:
$ manage.py migrate --fake <appname> zero
$ rm -rf migrations
$ manage.py makemigrations <appname>
$ manage.py migrate --fake <appname>
Run Code Online (Sandbox Code Playgroud)
这将 ...
Kha*_*edP 10
要重置所有迁移并重新开始,您可以运行以下命令:
\npython manage.py migrate <app_name> zero
\n\n\xe2\x84\xb9\xef\xb8\x8f 如果这导致您出现问题,您可以将该
\n--fake标志添加到命令末尾。
python manage.py makemigrations <app_name>
\n\n\xe2\x84\xb9\xef\xb8\x8f 仅当您删除或更改迁移文件时才执行此步骤
\n
python manage.py migrate <app_name>
\n\n\xe2\x9a\xa0\xef\xb8\x8f 如果您将命令添加
\n--fake到步骤 # 1,则需要添加--fake-initial到迁移命令,以便python manage.py migrate <app_name> --fake-initial
如果你想要一个完全干净的开始,你会想要放弃数据库。这意味着重新创建它,添加权限,重新生成所有迁移,重新运行它们并创建一个超级用户。
好消息是,您可以轻松地将所有这些变成单行/几行命令。
新的迁移文件
如果删除整个文件夹,则必须运行makemigrations提及所有应用程序名称的命令。如果经常这样做就很麻烦了。要让 Django 查看需要迁移的应用程序,您需要保留该migrations文件夹及其__init__.py内部内容。
这是一个 bash 命令:
find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)
然后是通常的(这应该为之前进行过迁移的所有应用程序创建迁移):
python manage.py makemigrations
Run Code Online (Sandbox Code Playgroud)
重置数据库
对于SQLite只需删除 DB 文件。
对于PostgreSQL,在控制台中运行:
psql -c "drop database <db_name>;"
psql -c "create database <db_name>;"
psql -c "grant all on database <db_name> to <db_user>;"
Run Code Online (Sandbox Code Playgroud)
然后最后重新运行迁移
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
超级用户
显然你会缺少一个超级用户,所以你可能还想这样做:
python manage.py createsuperuser
Run Code Online (Sandbox Code Playgroud)
无输入的方法是将 python 代码通过管道传输到 shell 中:
echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'badmin@myproject.com', 'pa$$w0rd')" | python manage.py shell
Run Code Online (Sandbox Code Playgroud)
一般来说,关于这些非常常见的操作- 帮自己一个忙,写一些 bash。在我使用 Django 的这些年里,它为我节省了很多很多时间。因为比单行命令更好的是拥有一个完整的实用程序文件来存储更多这些方便的函数。然后你可以运行类似的东西:
django --reset_migrations
db --reset <my_db>
django --migrate
Run Code Online (Sandbox Code Playgroud)
如果您发现自己重复相同的几个操作,甚至可以将其聚合为一行。将其添加到您的 bashprofile 中
reset_django() {
find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
python manage.py makemigrations
psql -c "drop database <db_name>;"
psql -c "create database <db_name>;"
psql -c "grant all on database <db_name> to <db_user>;"
python manage.py migrate
echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'badmin@myproject.com', 'pa$$w0rd')" | python manage.py shell
}
Run Code Online (Sandbox Code Playgroud)
我的 Django lite 实用程序的灵感:
#!/bin/bash
django() {
project_name=$(basename $PWD)
project_path="$PWD"
manage_path="${project_path}/${project_name}/manage.py"
if [ ! -f $manage_path ] ; then # No project/manage.py
echo "Error: Could not locate Django manage.py file."
return -1
fi
if [ $# -eq 0 ] ; then
echo "Django project detected."
fi
while [ ! $# -eq 0 ]
do
case "$1" in
--help | -h)
echo "Django shortcut, unknown commands are forwarded to manage.py"
echo " -c, --check Run Django manage.py check."
echo " --req Install requirements."
echo " -r, --run Run server."
echo " -s, --shell Run Django shell plus."
echo " -sd, --shell Run Django shell plus. Debug DB (print sql)"
echo ""
;;
--check | -c)
python $manage_path check
;;
--shell | -s)
python $manage_path shell_plus --bpython
;;
--shell | -sd)
python $manage_path shell_plus --bpython --print-sql
;;
--run | -r)
python $manage_path runserver
;;
--req)
pip install -r $project_path/requirements.txt
;;
--mig | -m)
python $manage_path makemigrations
python $manage_path migrate
;;
--reset_migrations)
find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
python $manage_path makemigrations
;;
*)
python $manage_path "$@"
;;
esac
shift
done
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40725 次 |
| 最近记录: |