我正在尝试应用迁移,但我收到错误:
django.db.utils.OperationalError:(1050,"表'customers_customer'已经存在")
我通过发出以下命令得到这个:
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
我的客户表已经存在,那么我该如何让迁移知道这一点,而不是出错,并对我的模型进行修改?
我在本地环境中用本地数据库运行它没有问题.当我将数据库指向生产并在migrate上面运行时,我得到了这个错误.
在django 1.8中,有一种方法可以运行特定的迁移和迁移.
不仅适用于一个应用程序,还适用于该应用程序迁移目录中的特定文件.
编辑原始:
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/vagrant/virtualenvs/aku/lib/python3.4/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "/home/vagrant/virtualenvs/aku/lib/python3.4/site-packages/django/core/management/__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/vagrant/virtualenvs/aku/lib/python3.4/site-packages/django/core/management/base.py", line 393, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/vagrant/virtualenvs/aku/lib/python3.4/site-packages/django/core/management/base.py", line 444, in execute
output = self.handle(*args, **options)
File "/home/vagrant/virtualenvs/aku/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 146, in handle
plan = executor.migration_plan(targets)
File "/home/vagrant/virtualenvs/aku/lib/python3.4/site-packages/django/db/migrations/executor.py", line 50, in migration_plan
self.loader.graph.node_map[target].children
KeyError: ('wagtailcore', '0001_initial')
Run Code Online (Sandbox Code Playgroud)
做了一点搜索并找到了这个https://code.djangoproject.com/ticket/24225#no1
我正在使用该RunPython方法创建数据迁移.但是,当我尝试在对象上运行方法时,没有定义.是否可以使用RunPython?调用模型上定义的方法?
我的迁移出了点问题,我在模型中添加了一个新的datetimefield然后我使用了makemigrations并进行迁移.
python manage.py makemigrations
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
但在此之后,迁移得到了"表已存在错误".我想我可以假装迁移并重新开始,所以我做到了
python manage.py makemigrations --fake core
Operations to perform:
Apply all migrations: core
Running migrations:
Rendering model states... DONE
Applying core.0001_initial... FAKED
Applying core.0002_auto_20150525_1331... FAKED
Applying core.0003_auto_20150525_1348... FAKED
Applying core.0004_processo_data_atualizacao... FAKED
Run Code Online (Sandbox Code Playgroud)
但是我刚刚创建的新迁移也是伪造的(当然!).
在执行此操作后,如何重做迁移(在本例中为core.0004)的正确方法?
我有一个Django应用程序,我想在其中将ForeignKey中的字段更改为ManyToManyField.我想保留我的旧数据.最简单/最好的流程是什么?如果重要,我使用sqlite3作为我的数据库后端.
如果我对问题的总结不清楚,这是一个例子.说我有两个型号:
class Author(models.Model):
author = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
假设我的数据库中有很多数据.现在,我想更改Book模型,如下所示:
class Book(models.Model):
author = models.ManyToManyField(Author)
title = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
我不想"丢失"我之前的所有数据.
完成此任务的最佳/最简单方法是什么?
肯
我在我的Django模型中添加了一个新的,不可为空的字段,并尝试使用迁移来部署该更改.如何将现有模型的默认值设置为这些模型的某些函数而不是常量?
举一个例子,假设我之前有一个created_on字段,我刚刚添加了一个updated_on字段,其值我想先设置为模型created_on.我如何在迁移中执行此操作?
这就是我想要开始的:
migrations.AddField(
model_name='series',
name='updated_as',
field=models.DateTimeField(default=????, auto_now=True),
preserve_default=False,
),
Run Code Online (Sandbox Code Playgroud) 所以我现在正在快速迭代一个django应用程序,我不断调整models.py.在一两天的编程和测试过程中,我生成了几十个迁移文件.有时候我真的撕开了架构并完全重新做了.这会导致迁移过程对默认值和空值等抱怨很多.如果可能的话,我只想抓住所有迁移的东西并重新开始迁移,因为我终于知道我在做什么了.到目前为止,我的方法如下:
__init__.py.DELETE FROM south_migrationhistory WHERE app_name='my_app';./manage.py makemigrations my_app- 这会0001_initial.py在我的迁移文件夹中生成一个文件../manage migrate my_app- 我希望这个命令重新构建我的所有表,但是它说:"没有要应用的迁移."是什么赋予了?
此外,south_migrationhistory数据库表现在仍然在播放,我已经转向南并已切换到Django 1.7?
谢谢.
django database-migration django-south django-1.7 django-migrations
我有一个数据迁移,可以更新一些权限.我知道迁移中的权限存在一些已知问题,我可以通过自己的迁移(而不是使用模型中的元组快捷方式)创建权限来避免一些麻烦.
迁移:
from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
def create_feature_groups(apps, schema_editor):
app = models.get_app('myauth')
Group = apps.get_model("auth", "Group")
pro = Group.objects.create(name='pro')
Permission = apps.get_model("auth", "Permission")
ContentType = apps.get_model("contenttypes", "ContentType")
invitation_contenttype = ContentType.objects.get(name='Invitation')
send_invitation = Permission.objects.create(
codename='send_invitation',
name='Can send Invitation',
content_type=invitation_contenttype)
pro.permissions.add(receive_invitation)
class Migration(migrations.Migration):
dependencies = [
('myauth', '0002_initial_data'),
]
operations = [
migrations.RunPython(create_feature_groups),
]
Run Code Online (Sandbox Code Playgroud)
经过一些试验和错误,我能够使用这项工作,manage.py migrate但我在测试中遇到错误manage.py test.
__fake__.DoesNotExist: ContentType matching query does not exist.
Run Code Online (Sandbox Code Playgroud)
稍微调试发现,ContentType在测试中运行时,迁移中此时没有(不确定原因).按照这篇文章中的建议,我尝试在自己的迁移中手动更新内容类型.添加 …
Django runserver抱怨说:
You have unapplied migrations;
your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
Run Code Online (Sandbox Code Playgroud)
如何在不运行迁移的情况下找出未应用的迁移?
我有一个uuid字段(不是主键).生成的迁移是:
from __future__ import unicode_literals
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
....
]
operations = [
...
migrations.AddField(
model_name='device',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, unique=True),
),
...
]
Run Code Online (Sandbox Code Playgroud)
但是当python manage.py migrate它做的时候崩溃:
django.db.utils.IntegrityError:无法创建唯一索引"restaurants_device_uuid_key"DETAIL:Key(uuid)=(f3858ded-b8e0-4ac0-8436-8a61b10efc73)重复.
奇怪的是,主键(它可能是由数据库创建的,而不是由django内部创建的)似乎不会出现问题.
如何添加uuid字段,并确保迁移有效?