【问题标题】:Django: OperationalError No Such TableDjango:OperationalError 没有这样的表
【发布时间】:2014-11-04 11:25:58
【问题描述】:

我正在使用 Django-CMS 的 Django 项目中构建一个相当简单的应用程序研究。 (这是我对项目/应用程序的第一次全新尝试。)它的主要目的是存储各种智力资产(即研究人员撰写的文章、书籍等)。

问题是,当我将浏览器指向/research/ 时,我收到一条错误消息,指出table 'research_journal' doesn't exist ("no such table")

我正在使用带有 sqlite3 数据库的 Djnago 1.6.5。

查看python manage.py sql research 产生:

BEGIN;
CREATE TABLE "research_researchbase" (
    "id" integer NOT NULL PRIMARY KEY,
    "pub_date" datetime NOT NULL,
    "authors" varchar(200) NOT NULL,
    "year" varchar(25) NOT NULL,
    "title" varchar(200) NOT NULL,
    "subtitle" varchar(200) NOT NULL,
    "image_id" integer NOT NULL REFERENCES "filer_image" ("file_ptr_id"),
    "link" varchar(200) NOT NULL
)
;
CREATE TABLE "research_journal" (
    "researchbase_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "research_researchbase" ("id"),
    "journal" varchar(200) NOT NULL,
    "abstract" text NOT NULL,
    "citation" varchar(200) NOT NULL
)
;
CREATE TABLE "research_encyclopedia_chapter" (
    "researchbase_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "research_researchbase" ("id"),
    "encyclopedia" varchar(200) NOT NULL,
    "publisher" varchar(200) NOT NULL,
    "summary" varchar(200) NOT NULL
)
;
CREATE TABLE "research_book" (
    "researchbase_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "research_researchbase" ("id"),
    "publisher" varchar(200) NOT NULL,
    "summary" varchar(200) NOT NULL
)
;

COMMIT;

我已经运行 python manage.py migrate research 并得到:

/Users/XXX/Documents/repos/sfs/env/lib/python2.7/site-packages/app_data/fields.py:2: DeprecationWarning: django.utils.simplejson is deprecated; use json instead.
  from django.utils import simplejson as json

Running migrations for research:
- Nothing to migrate.
 - Loading initial data for research.
Installed 0 object(s) from 0 fixture(s)

我已经运行 python manage.py syncdb 并得到以下信息:

Syncing...
Creating tables ...
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

Synced:
 > djangocms_admin_style
 > django.contrib.auth
 > django.contrib.contenttypes
 > django.contrib.sessions
 > django.contrib.admin
 > django.contrib.sites
 > django.contrib.sitemaps
 > django.contrib.staticfiles
 > django.contrib.messages
 > mptt
 > south
 > sekizai
 > django_select2
 > hvad

Not synced (use migrations):
 - djangocms_text_ckeditor
 - cms
 - menus
 - djangocms_style
 - djangocms_column
 - djangocms_file
 - djangocms_flash
 - djangocms_googlemap
 - djangocms_inherit
 - djangocms_link
 - djangocms_picture
 - djangocms_teaser
 - djangocms_video
 - reversion
 - polls
 - djangocms_polls
 - aldryn_blog
 - easy_thumbnails
 - filer
 - taggit
 - research
(use ./manage.py migrate to migrate these)

这是models.py

from django.db import models
from django.utils import timezone
from filer.fields.image import FilerImageField

import datetime

class ResearchBase(models.Model):
    pub_date = models.DateTimeField('date published')
    authors = models.CharField(max_length=200)
    year = models.CharField(max_length=25)
    title = models.CharField(max_length=200)
    subtitle = models.CharField(max_length=200, blank=True)
    image = FilerImageField()
    link = models.CharField(max_length=200, blank=True)
    
    def __unicode__(self):
        return self.title
    
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
        

class Journal(ResearchBase):
    journal = models.CharField(max_length=200)
    abstract = models.TextField()
    citation = models.CharField(max_length=200)
    
    
class Encyclopedia_Chapter(ResearchBase):
    encyclopedia = models.CharField(max_length=200)
    publisher = models.CharField(max_length=200)
    summary = models.CharField(max_length=200)
    
        
class Book(ResearchBase):
    publisher = models.CharField(max_length=200)
    summary = models.CharField(max_length=200)

这是我的views.py(请注意,我通过渲染传递了两个对象,忽略我尚未在整个交易中包含类 Books 的事实):

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, Http404
from django.template import RequestContext, loader

from research.models import Journal, Encyclopedia_Chapter, Book

def research_index(request):
    latest_journal_list = Journal.objects.order_by('-pub_date')[:5]
    latest_chapter_list = Encyclopedia_Chapter.objects.order_by('-pub_date')[:5]
    
    context = {
        'latest_journal_list': latest_journal_list,
        'latest_chapter_list': latest_chapter_list
    }
    
    return render(request, 'research/index.html', context)
    
def journal_detail(request, journal_id):
    journal = get_object_or_404(Journal, pk=journal_id)
    return render(request, 'research/journal_detail.html', {'journal': journal})
    
def chapter_detail(request, chapter_id):
    chapter = get_object_or_404(Encyclopedia_Chapter, pk=chapter_id)
    return render(request, 'research/chapter_detail.html', {'chapter': chapter})

这是应用程序的url.py

from django.conf.urls import patterns, url

from research import views

urlpatterns = patterns('',
    url(r'^$', views.research_index, name='research'),
    url(r'^(?P<journal_id>\d+)/$', views.journal_detail, name='journal_detail'),
    url(r'^(?P<chapter_id>\d+)/$', views.chapter_detail, name='chapter_detail'),
)

这是index.html 模板:

{% extends 'research/base.html' %}

{% block research_content %}

<div class="container">
    <div class="row featurette">
        <h3 id="research">Peer-reviewed Journal Articles</h3>
        {% if latest_journal_list %}
            <ul id="research">
            {% for journal in latest_journal_list %}
                <li id="research">
                            <img src="{{ journal.image.url }}" id="research">
                            <h4>{{ journal.journal }}</h4>
                            <h5>{{ journal.title }}</h5>
                            <a href="{% url 'research:journal_detail' journal.id %}">Read More</a>
                        </li>
            {% endfor %}
            </ul>
        {% else %}
            <p>No journals are available.</p>
        {% endif %}
    </div>
    
    <div class="row featurette">
        <h3 id="research">Encyclopedia Chapters</h3>
        {% if latest_chapter_list %}
            <ul id="research">
            {% for chapter in latest_chapter_list %}
                <li id="research">
                            <img src="{{ chapter.image.url }}" id="research">
                            <h4>{{ chapter.journal }}</h4>
                            <h5>{{ chapter.title }}</h5>
                            <a href="{% url 'research:chapter_detail' chapter.id %}">Read More</a>
                        </li>
            {% endfor %}
            </ul>
        {% else %}
            <p>No encyclopedia chapters are available.</p>
        {% endif %}
    </div>
</div>

{% endblock %}

以防万一,这是我的cms_app.py

from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from django.utils.translation import ugettext_lazy as _


class ResearchApp(CMSApp):
    name = _("Research App")
    urls = ["research.urls"]
    app_name = "research"

apphook_pool.register(ResearchApp)

【问题讨论】:

  • 你运行 python manage.py syncdb 了吗?
  • 是的。我已经运行了 python manage.py syncdb (将结果添加到帖子中)。我的印象是,但是使用 south via migrate 消除了通过上述命令同步数据库的需要。这不正确吗?
  • 您是否尝试再次删除 DB 和 syncDB?
  • 我不想删除整个数据库并丢失其他表(及其数据)。我尝试了./manage.py sqlclear research | ./manage.py dbshell,然后是./manage.py syncdb,这清除了研究表。最终,这也没有奏效。请参阅下面的解决方案...
  • 即使你在项目中添加了 South,你仍然需要在第一次运行时运行 syncdb,只有在之后你才能删除这个命令。

标签: django django-cms


【解决方案1】:

用途:

python manage.py migrate --run-syncdb 

作为stated in this commentBenyamin Jafari

--run-syncdb - 为无需迁移的应用创建表。

也不要忘记指定应用路径。例如:

python manage.py makemigrations app
python manage.py migrate app

【讨论】:

  • 别忘了先运行python makemigrations
  • --run-syncdb 选项是什么?
  • 我找到了:--run-syncdb --> 为没有迁移的应用创建表。
  • 这行得通,但在运行makemigrations 和上述命令之前,我必须从&lt;app_dir&gt;/migrations 中删除.py.pyc 迁移文件。
  • 我运行了这个命令,但还是抛出了 OperationalError。我还删除了我的 db.sqlite3 & migrations 文件夹,但仍然出现同样的错误。
【解决方案2】:

对于 django 1.10,您可能需要执行 python manage.py makemigrations appname

【讨论】:

    【解决方案3】:

    如果有人发现任何建议:

    python manage.py makemigrations
    python manage.py migrate
    python manage.py migrate --run-syncdb
    

    失败,您可能需要在应用目录中添加一个名为“migrations”的文件夹,并创建一个空的__init__.py 文件。

    【讨论】:

    • 我不小心删除了init.py,所以报错了
    • 不小心删除了init.py,所以报错了。
    【解决方案4】:

    我的迁移似乎有问题。

    我跑了./manage.py schemamigration research --auto,发现很多字段没有指定默认值。

    所以,我跑了./manage.py schemamigration research --init,然后是./manage.py migrate research

    从那里重新运行服务器就可以了!

    【讨论】:

    • 评论有更多赞,然后是答案本身。 @Brian,请用这些有用的信息更新答案。
    • 对我来说是Unknown command: 'schemamigration'. Did you mean showmigrations?
    【解决方案5】:

    这个问题可以通过运行迁移来解决。

    1. python manage.py makemigrations
    2. python manage.py migrate

    每当您在models.py 中进行更改时,请执行上述操作。

    【讨论】:

      【解决方案6】:

      当您尚未迁移到新创建的表时,会出现此错误, 因此,首先在 cmd 上编写命令为:python manage.py makemigrations,然后编写另一个命令以应用由 makemigrations 命令进行的这些迁移:python manage.py migrate

      【讨论】:

        【解决方案7】:

        运行以下命令为我解决了这个问题

        1. python manage.py migrate
        2. python manage.py makemigrations
        3. python manage.py makemigrations appName

        【讨论】:

          【解决方案8】:

          当我进入管理面板时,我遇到了同样的错误。 您应该改为运行它-:python manage.py migrate --run-syncdb。 不要忘记包含 migrate,我跑了:

          python manage.py make migrations 然后 python manage.py migrate

          当错误仍然存​​在时,我使用上述建议的命令进行了尝试。

          【讨论】:

            【解决方案9】:

            我正在使用 Django 1.9、SQLite3 和 DjangoCMS 3.2 并且遇到了同样的问题。我通过运行python manage.py makemigrations 解决了这个问题。紧随其后的是一个提示,指出数据库包含非空值类型但没有设置默认值。它给了我两个选项:1) 现在选择一次性值或 2) 退出并更改 models.py 中的默认设置。我选择了第一个选项,并给出了默认值 1。重复此操作四五次,直到提示说完成。然后我跑了python manage.py migrate。现在它工作得很好。请记住,通过首先运行 python manage.py makemigrations,会创建一个修改后的数据库副本(我的是 0004),您可以随时恢复到以前的数据库状态。

            【讨论】:

              【解决方案10】:

              对我有用的东西:

              1. 如果未在 models.py 中添加类,请找出迁移文件夹中的哪些迁移创建了表。
              2. 如果该类已存在于您的 models.py 中,请尝试删除该类并运行 python manage.py makemigrations &lt;appname&gt;
              3. 在迁移假迁移时,由于您的错误可能会说找不到要删除的表,使用python manage.py migrate &lt;yourappname&gt; --fake
              4. 再次添加类并再次进行迁移python manage.py makemigrations &lt;appname&gt;
              5. 最后再次迁移python manage.py migrate &lt;appname&gt;

              【讨论】:

                【解决方案11】:

                这发生在我身上,对我来说,这是因为我将 db.sqlite3 添加为未从存储库中跟踪。我添加它并将其推送到服务器,以便它正常工作。 执行此操作后还要运行 makemigartionsmigrate

                【讨论】:

                  【解决方案12】:

                  如果您在此列表的底部找到此答案,我几乎可以肯定它会解决您的所有问题 :) 在我的例子中,我删除了一个数据库表,而 makemigrationsmigrate 却一无所获

                  所以我得到了关于如何在this link上重置所有内容的非常详细的答案

                  【讨论】:

                    【解决方案13】:

                    我将 Django CMS 3.4 与 Django 1.8 一起使用。 我逐步了解了 Django CMS 代码中的根本原因。 根本原因是 Django CMS 在进行数据库调用之前没有将目录更改为包含 SQLite3 数据库的文件的目录。错误消息是虚假的。根本问题是在错误的目录中进行了 SQLite 数据库调用。

                    解决方法是确保所有 Django 应用程序在切换到工作目录时都将目录切换回 Django 项目根目录。

                    【讨论】:

                      【解决方案14】:

                      在我的情况下,通过从Django-Extensions 运行reset_db 命令来重置数据库(实际上是开发环境)解决了这个问题:

                      python manage.py reset_db
                      

                      之后我运行了以下命令:

                      1. python manage.py makemigrations
                      2. python manage.py migrate

                      【讨论】:

                      • 惊人的 Django 扩展 - 谢谢。但它并没有解决我的问题。
                      【解决方案15】:

                      关闭终端并再次打开它并运行以下命令:

                      1. python manage.py migrate (app name)
                      2. python manage.py makemigrations
                      3. python manage.py makemigrations (appname)

                      【讨论】:

                        猜你喜欢
                        • 2020-09-24
                        • 2016-08-23
                        • 2017-02-19
                        • 2012-09-28
                        • 2019-05-17
                        • 2021-12-10
                        • 2020-05-30
                        • 2020-02-11
                        • 2012-10-16
                        相关资源
                        最近更新 更多