迁移后的 Django-cms 1.7.10 “OperationalError - no such column”

Posted

技术标签:

【中文标题】迁移后的 Django-cms 1.7.10 “OperationalError - no such column”【英文标题】:Django-cms 1.7.10 "OperationalError - no such column" after migration 【发布时间】:2016-01-31 16:47:12 【问题描述】:

所以我知道已经有很多人提出了很多问题,他们更改了模型,然后未能将迁移应用到他们的数据库。但是,就我而言,我知道迁移已应用,因为我可以看到新的表数据。

基本上,我安装了 django-cms,然后我在 djangocms_column 插件的models.py 中添加了一个字段,以允许我在我的列中添加一个 Bootstrap 类名称(例如col-md-4col-md-6 等)。

if hasattr(settings, "COLUMN_CLASS_CHOICES"):
    CLASS_CHOICES = settings.COLUMN_CLASS_CHOICES
else:
    CLASS_CHOICES = (
        ('col-md-1', _("col-md-1")),
        ('col-md-2', _("col-md-2")),
        ('col-md-3', _('col-md-3')),
        ('col-md-4', _("col-md-4")),
        ('col-md-5', _('col-md-5')),
        ('col-md-6', _("col-md-6")),
        ('col-md-7', _('col-md-7')),
        ('col-md-8', _('col-md-8')),
        ('col-md-9', _('col-md-9')),
        ('col-md-10', _('col-md-10')),
        ('col-md-11', _('col-md-11')),
        ('col-md-12', _('col-md-12')),
        ('', _('none')),
    )

...

@python_2_unicode_compatible
class Column(CMSPlugin):
    """
    A Column for the MultiColumns Plugin
    """

    width = models.CharField(_("width"), choices=WIDTH_CHOICES, default=WIDTH_CHOICES[0][0], max_length=50)

    """
    This is the new field:
    """
    bs_class = models.CharField(_("bs_class"), choices=CLASS_CHOICES, default=CLASS_CHOICES[0][0], max_length=50)

    def __str__(self):
        return u"%s" % self.get_width_display()

然后我运行./manage.py makemigrations,然后运行./manage.py migrate,现在表格如下所示:

sqlite> select * from djangocms_column_column;
cmsplugin_ptr_id  bs_class    width     
----------------  ----------  ----------
3                 col-md-1    33%       
5                 col-md-1    33%       
7                 col-md-1    33%       
19                col-md-1    33%       
21                col-md-1    33%       
23                col-md-1    33% 

然而,当我尝试访问测试服务器时,我仍然收到以下错误:

OperationalError at /en/
no such column: djangocms_column_column.bs_class
Request Method: GET
Request URL:    http://localhost:8000/en/
Django Version: 1.7.10
Exception Type: OperationalError
Exception Value:    
no such column: djangocms_column_column.bs_class

是的,我已经尝试删除数据库并运行./manage.py migrate,但该站点仍然显示相同的错误。是否必须使用特殊的迁移程序来修改安装在./env/lib/python2.7/site-packages 文件夹中的插件?

【问题讨论】:

【参考方案1】:

您是否尝试过删除应用内迁移文件夹中的迁移?

【讨论】:

应用文件夹中没有任何迁移。唯一没有 django-cms 的迁移是添加该列的迁移,它位于 ./env/lib/python2.7/site-packages/djangocms_column/migrations_django 文件夹中。我不确定删除它会如何修复错误。 运行 makemigration 时不显示 'books' 的迁移:0001_auto.py: 这些 0001_auto.py 文件是存储在迁移文件夹中的迁移,该文件夹位于其中应用程序。【参考方案2】:

所以我实际上弄清楚了导致这种行为的原因。在设计我的 gulp 任务时,我重组了项目文件夹,将我所有 django 创建的文件放在 src 子目录中。

我这样做是为了在gulpfile.jsbower_components 中的文件被修改时,以这种方式观察我的应用程序文件的更改会更容易,而不会无意触发我的观察任务。 (最终,这并不重要,因为我的 glob 比 django 项目根更具体。)

除了settings.DATABASES['default']['NAME'] 是相对路径project.db 之外,这不会是一个问题。结果,当我从/src 目录中运行./manage.py migrate 时,它在/src/project.db 上执行了迁移。当我从父目录运行src/manage.py migrate 时,迁移是在/project.db 上执行的。 djangocms 应用程序本身正在使用后者,而我一直在对前者执行所有迁移。

所以这里的教训是:

确保使用绝对路径指定您的 sqlite 文件。 当您遇到看似莫名其妙的迁移问题时,请检查以确保您的工作区中没有浮动多个 .db 文件。

【讨论】:

以上是关于迁移后的 Django-cms 1.7.10 “OperationalError - no such column”的主要内容,如果未能解决你的问题,请参考以下文章

如何为新服务器运行迁移

Django-CMS:意外的关键字参数'providing_args'

django 可重用应用程序:删除迁移中的依赖项?

django-cms 和 jQuery

Django-cms 和自动阻塞

在 Django 中将 SQLite3 数据库迁移到 MySQL