Django 1.7迁移:django.db.utils.OperationalError:没有这样的表:db_trans_language

时间:2015-04-30 08:51:34

标签: python django migration django-1.7

我正在研究django项目,并且在我的(测试)prod设置中遇到了一些迁移问题,因此我将所有相关数据转储出来,现在我正在从头开始设置数据库。

以下是发生的事情:

  1. 我从应用中删除了所有(可能)错误的迁移
  2. 我运行makemigrations
  3. 我运行迁移
  4. 我收到以下错误:
  5. 错误:

    C:\Users\Sverker\Dropbox\Picrates>python manage.py makemigrations db_trans
    C:\Users\Sverker\Dropbox\Picrates\picrates_project
    Migrations for 'db_trans':
      0001_initial.py:
        - Create model Language
        - Create model Markup
        - Create model String
        - Create model TransMarkup
        - Create model TransString
        - Add field trans_string to string
        - Alter unique_together for string (1 constraint(s))
        - Add field trans_markup to markup
        - Alter unique_together for markup (1 constraint(s))
    
    C:\Users\Sverker\Dropbox\Picrates>python manage.py migrate
    C:\Users\Sverker\Dropbox\Picrates\picrates_project
    Operations to perform:
      Synchronize unmigrated apps: allauth, linkedin_oauth2, crispy_forms
      Apply all migrations: account, sessions, admin, db_trans, sites, auth, contenttypes, parties, ped, socialaccount
    Synchronizing apps without migrations:
      Creating tables...
      Installing custom SQL...
      Installing indexes...
    Running migrations:
      Applying db_trans.0001_initial...Traceback (most recent call last):
      File "manage.py", line 15, in <module>
        execute_from_command_line(sys.argv)
      File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 385, in execute_from_command_line
        utility.execute()
      File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 377, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "C:\Python27\lib\site-packages\django\core\management\base.py", line 288, in run_from_argv
        self.execute(*args, **options.__dict__)
      File "C:\Python27\lib\site-packages\django\core\management\base.py", line 338, in execute
        output = self.handle(*args, **options)
      File "C:\Python27\lib\site-packages\django\core\management\commands\migrate.py", line 161, in handle
        executor.migrate(targets, plan, fake=options.get("fake", False))
      File "C:\Python27\lib\site-packages\django\db\migrations\executor.py", line 68, in migrate
        self.apply_migration(migration, fake=fake)
      File "C:\Python27\lib\site-packages\django\db\migrations\executor.py", line 102, in apply_migration
        migration.apply(project_state, schema_editor)
      File "C:\Python27\lib\site-packages\django\db\migrations\migration.py", line 108, in apply
        operation.database_forwards(self.app_label, schema_editor, project_state, new_state)
      File "C:\Python27\lib\site-packages\django\db\migrations\operations\models.py", line 36, in database_forwards
        schema_editor.create_model(model)
      File "C:\Python27\lib\site-packages\django\db\backends\schema.py", line 213, in create_model
        definition, extra_params = self.column_sql(model, field)
      File "C:\Python27\lib\site-packages\django\db\backends\schema.py", line 125, in column_sql
        default_value = self.effective_default(field)
      File "C:\Python27\lib\site-packages\django\db\backends\schema.py", line 175, in effective_default
        default = field.get_default()
      File "C:\Python27\lib\site-packages\django\db\models\fields\__init__.py", line 719, in get_default
        return self.default()
      File "C:\Users\Sverker\Dropbox\Picrates\db_trans\models.py", line 9, in get_default_priority
        max = Language.objects.all().aggregate(models.Max("fallback_priority"))["fallback_priority__max"]
      File "C:\Python27\lib\site-packages\django\db\models\query.py", line 325, in aggregate
        return query.get_aggregation(using=self.db, force_subq=force_subq)
      File "C:\Python27\lib\site-packages\django\db\models\sql\query.py", line 402, in get_aggregation
        result = query.get_compiler(using).execute_sql(SINGLE)
      File "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py", line 786, in execute_sql
        cursor.execute(sql, params)
      File "C:\Python27\lib\site-packages\django\db\backends\utils.py", line 81, in execute
        return super(CursorDebugWrapper, self).execute(sql, params)
      File "C:\Python27\lib\site-packages\django\db\backends\utils.py", line 65, in execute
        return self.cursor.execute(sql, params)
      File "C:\Python27\lib\site-packages\django\db\utils.py", line 94, in __exit__
        six.reraise(dj_exc_type, dj_exc_value, traceback)
      File "C:\Python27\lib\site-packages\django\db\backends\utils.py", line 65, in execute
        return self.cursor.execute(sql, params)
      File "C:\Python27\lib\site-packages\django\db\backends\sqlite3\base.py", line 485, in execute
        return Database.Cursor.execute(self, query, params)
    django.db.utils.OperationalError: no such table: db_trans_language
    

    以下是创建的迁移:

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    
    from django.db import models, migrations
    import markupfield.fields
    import db_trans.models
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
        ]
    
        operations = [
            migrations.CreateModel(
                name='Language',
                fields=[
                    ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                    ('code', models.CharField(max_length=3)),
                    ('language', models.CharField(max_length=50)),
                    ('is_public', models.BooleanField(default=False)),
                    ('fallback_priority', models.PositiveIntegerField(default=db_trans.models.get_default_priority, help_text=b'Lowest value will be first fallback language.', unique=True)),
                ],
                options={
                },
                bases=(models.Model,),
            ),
            migrations.CreateModel(
                name='Markup',
                fields=[
                    ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                    ('markup', markupfield.fields.MarkupField()),
                    ('markup_markup_type', models.CharField(default=b'markdown', max_length=30, editable=False, choices=[(b'', b'--'), (b'html', b'html'), (b'plain', b'plain'), (b'markdown', b'markdown')])),
                    ('_markup_rendered', models.TextField(editable=False)),
                    ('language', models.ForeignKey(to='db_trans.Language')),
                ],
                options={
                },
                bases=(models.Model,),
            ),
            migrations.CreateModel(
                name='String',
                fields=[
                    ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                    ('string', models.CharField(max_length=256)),
                    ('language', models.ForeignKey(to='db_trans.Language')),
                ],
                options={
                },
                bases=(models.Model,),
            ),
            migrations.CreateModel(
                name='TransMarkup',
                fields=[
                    ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                    ('key', models.CharField(unique=True, max_length=50, db_index=True)),
                    ('verbose_name', models.CharField(max_length=200, null=True, blank=True)),
                ],
                options={
                    'verbose_name': 'Translated Markup',
                },
                bases=(models.Model,),
            ),
            migrations.CreateModel(
                name='TransString',
                fields=[
                    ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                    ('key', models.CharField(unique=True, max_length=50, db_index=True)),
                    ('verbose_name', models.CharField(max_length=200, null=True, blank=True)),
                ],
                options={
                    'verbose_name': 'Translated String',
                },
                bases=(models.Model,),
            ),
            migrations.AddField(
                model_name='string',
                name='trans_string',
                field=models.ForeignKey(related_name='strings', to='db_trans.TransString'),
                preserve_default=True,
            ),
            migrations.AlterUniqueTogether(
                name='string',
                unique_together=set([('trans_string', 'language')]),
            ),
            migrations.AddField(
                model_name='markup',
                name='trans_markup',
                field=models.ForeignKey(related_name='markups', to='db_trans.TransMarkup'),
                preserve_default=True,
            ),
            migrations.AlterUniqueTogether(
                name='markup',
                unique_together=set([('trans_markup', 'language')]),
            ),
        ]
    

    models.py:

    from django.db import models
    from django.template.loader import render_to_string
    from django.utils.translation import get_language
    from markupfield.fields import MarkupField
    
    
    def get_default_priority():
        max = Language.objects.all().aggregate(models.Max("fallback_priority"))["fallback_priority__max"]
        if max:
            return max + 10
        return 50
    
    
    class Language(models.Model):
        code = models.CharField(
            max_length=3,
            null=False,
            blank=False,
        )
    
        language = models.CharField(
            max_length=50,
        )
    
        is_public = models.BooleanField(
            default=False,
        )
    
        fallback_priority = models.PositiveIntegerField(
            null=False,
            unique=True,
            default=get_default_priority,
            help_text="Lowest value will be first fallback language."
        )
    
        def __unicode__(self):
            unicode = self.code
            if self.language:
                unicode += u" - " + self.language
            return unicode
    
    
    class TransPhrase(models.Model):
        key = models.CharField(
            max_length=50,
            unique=True,
            null=False,
            blank=False,
            db_index=True,
        )
    
        verbose_name = models.CharField(
            max_length=200,
            null=True,
            blank=True,
        )
    
        @classmethod
        def get_translation(cls, key, description=None):
            trans_phrase, created = cls.objects.get_or_create(key=key)
            if not description:
                trans_phrase.verbose_name = description
                trans_phrase.save()
            return trans_phrase
    
    
        def render(self, wrap, csrf_token):
            raise NotImplementedError
    
        class Meta:
            abstract = True
    
    
    class TransMarkup(TransPhrase):
        def get_trans(self, language_code, use_fallback=True):
            try:
                return self.markups.get(language__code=language_code)
            except Markup.DoesNotExist:
                if use_fallback:
                    fallback_markups = self.markups.all().order_by("language__fallback_priority")
                    if fallback_markups:
                        return fallback_markups[0]
    
                language = Language.objects.get(code=language_code)
                return Markup(trans_markup=self, language=language)
    
        def __unicode__(self):
            return u"[" + self.key + u"]"
    
        def render(self, wrap, csrf_token):
            from db_trans.forms import SetTransMarkupForm
    
            markup = self.get_trans(get_language(), use_fallback=(not wrap))
            if wrap:
                context = {
                    "csrf_token": csrf_token,
                    "form": SetTransMarkupForm(instance=markup),
                    "trans_markup": markup
                }
                return render_to_string("db_trans/set_markup.html", context)
            else:
                return markup
    
        class Meta:
            verbose_name = "Translated Markup"
    
    
    class Markup(models.Model):
        markup = MarkupField(
            markup_type="markdown"
        )
    
        trans_markup = models.ForeignKey(
            TransMarkup,
            null=False,
            related_name="markups",
        )
    
        language = models.ForeignKey(
            Language,
            null=False,
        )
    
        def __unicode__(self):
            if self.markup.rendered:
                return self.markup.rendered
            return u"[" + self.trans_markup.key + u"]"
    
        class Meta:
            unique_together = ("trans_markup", "language")
    
    
    class TransString(TransPhrase):
        def get_trans(self, language_code, use_fallback=True):
            try:
                return self.strings.get(language__code=language_code)
            except String.DoesNotExist:
                if use_fallback:
                    fallback_strings = self.strings.all().order_by("language__fallback_priority")
                    if fallback_strings:
                        return fallback_strings[0]
    
                language = Language.objects.get(code=language_code)
                return String(trans_string=self, language=language)
    
    
        def render(self, wrap, csrf_token):
            from db_trans.forms import SetTransStringForm
    
            string = self.get_trans(get_language(), use_fallback=(not wrap))
            if wrap:
                context = {
                    "csrf_token": csrf_token,
                    "form": SetTransStringForm(instance=string),
                    "trans_string": string
                }
                return render_to_string("db_trans/set_string.html", context)
            else:
                return string
    
        class Meta:
            verbose_name = "Translated String"
    
    
    class String(models.Model):
        string = models.CharField(
            max_length=256
        )
    
        trans_string = models.ForeignKey(
            TransString,
            null=False,
            related_name="strings"
        )
    
        language = models.ForeignKey(
            Language,
            null=False,
        )
    
        def __unicode__(self):
            if self.string:
                return self.string
            return u"[" + self.trans_string.key + u"]"
    
        class Meta:
            unique_together = ("trans_string", "language")
    

    非常感谢帮助!

1 个答案:

答案 0 :(得分:0)

我知道这是一个老问题,但我最近有a similar error。进攻线可能是:

File "C:\Users\Sverker\Dropbox\Picrates\db_trans\models.py", line 9, in get_default_priority
  max = Language.objects.all().aggregate(models.Max("fallback_priority"))["fallback_priority__max"]

所以在这里,您使用Language.objects.all()查询数据库。在实际运行迁移之前执行此行,而models.py与数据库本身之间仍然存在不一致。

尝试注释掉该行(以及对max的其他引用),然后重新运行迁移。这对我有用。