Django: OperationalError Keine solche Tabelle

73

Ich baue in meinem Django-Projekt eine ziemlich einfache Anwendung, Recherche, die Django-CMS verwendet. (Es ist mein erster grundlegender Versuch, ein Projekt / eine Anwendung zu erstellen.) Der Hauptzweck besteht darin, verschiedene geistige Vermögenswerte (z. B. Artikel, Bücher usw., die von einem Forscher geschrieben wurden) zu speichern.

Das Problem ist, dass wenn ich den Browser auf / research / zeige, eine Fehlermeldung angezeigt wird, dass die Tabelle 'research_journal' nicht existiert ("keine solche Tabelle").

Ich verwende Djnago 1.6.5 mit einer SQLite3-Datenbank.

Mit Blick auf die python manage.py sql researchRenditen:

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;

Ich bin gelaufen python manage.py migrate researchund habe:

/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)

Ich bin gelaufen python manage.py syncdbund habe folgendes bekommen:

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)

Hier ist die 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)

Hier ist meine Ansicht.

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})

Hier ist die url.py der Anwendung:

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'),
)

Hier ist die Vorlage 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 %}

Nur für den Fall, dass es wichtig ist, hier ist meine 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)

Gedanken? Jede Hilfe wäre sehr dankbar.

Brian
quelle
Haben Sie python manage.py syncdb ausgeführt?
Jabez
Ja. Ich habe python manage.py syncdb ausgeführt (Ergebnis zum Beitrag hinzugefügt). Ich hatte jedoch den Eindruck, dass die Verwendung von South via Migrate die Synchronisierung der Datenbank über den oben genannten Befehl überflüssig machte. Ist das falsch
Brian
Haben Sie versucht, die Datenbank und die SyncDB erneut zu löschen?
Ppolak
Ich wollte nicht die gesamte Datenbank löschen und andere Tabellen (und deren Daten) verlieren. Ich versuchte es ./manage.py sqlclear research | ./manage.py dbshellgefolgt von ./manage.py syncdb, was den Forschungstisch räumte. Letztendlich hat das auch nicht funktioniert. Siehe meine Lösung unten ...
Brian
Selbst wenn Sie dem Projekt South hinzugefügt haben, müssen Sie syncdb beim ersten Start noch ausführen. Erst danach können Sie diesen Befehl löschen.
Jabez

Antworten:

185

Dieser Kommentar auf dieser Seite hat für mich und einige andere funktioniert. Es verdient seine eigene Antwort:

python manage.py migrate --run-syncdb
kqw
quelle
6
Vergessen Sie nicht , laufen python makemigrationszuerst
Aminah Nuraini
Was ist die --run-syncdbOption?
Benyamin Jafari
8
Ich habe es gefunden: --run-syncdb -> Erstellt Tabellen für Apps ohne Migrationen.
Benyamin Jafari
3
Dies funktionierte, aber ich musste die .pyund .pycMigrationsdateien <app_dir>/migrationsvor dem Ausführen makemigrationsund den obigen Befehl entfernen .
Anthony
Ich habe diesen Befehl ausgeführt und der OperationalError wurde immer noch ausgelöst. Ich habe auch meinen Ordner db.sqlite3 & migrations gelöscht, erhalte aber immer noch den gleichen Fehler.
LC
29

Für Django 1.10 müssen Sie möglicherweise tun python manage.py makemigrations appname.

Stryker
quelle
20

Anscheinend gab es ein Problem mit meiner Migration.

Ich lief ./manage.py schemamigration research --autound stellte fest, dass in vielen Feldern keine Standardeinstellung angegeben war.

Also rannte ich ./manage.py schemamigration research --initgefolgt von./manage.py migrate research

Das erneute Ausführen des Servers von dort aus hat den Trick getan!

Brian
quelle
Ein Kommentar hat mehr Likes als die Antwort selbst. @Brian, bitte aktualisieren Sie die Antwort mit diesen nützlichen Informationen.
Girishkumar
16

Wenn jemand feststellt, dass einer der vorgeschlagenen:

python manage.py makemigrations

python manage.py migrate

python manage.py migrate --run-syncdb

Wenn dies fehlschlägt, müssen Sie möglicherweise einen Ordner mit dem Namen " migrations" im App-Verzeichnis hinzufügen und eine leere __init__.pyDatei erstellen .

Micheal J. Roberts
quelle
7

Das Problem kann durch Ausführen von Migrationen behoben werden.

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

Führen Sie die oben genannten Vorgänge aus, wenn Sie Änderungen an vornehmen models.py.

Ravi Teja Mureboina
quelle
5

Dieser Fehler tritt auf, wenn Sie keine Migrationen in Ihre neu erstellte Tabelle vorgenommen haben. Schreiben Sie also zuerst den Befehl auf cmd als: python manage.py makemigrationsund schreiben Sie dann einen weiteren Befehl zum Anwenden dieser mit dem Befehl makemigrations vorgenommenen Migrationen:python manage.py migrate

Harmanjit Singh Parmar
quelle
3

Das Ausführen der folgenden Befehle löste dieses Problem für mich: 1. python manage.py migrate 2. python manage.py makemigrations 3. python manage.py makemigrations appName

skrstv123
quelle
2

Ich verwende Django 1.9, SQLite3 und DjangoCMS 3.2 und hatte das gleiche Problem. Ich habe es durch Laufen gelöst python manage.py makemigrations. Darauf folgte eine Eingabeaufforderung, die besagte, dass die Datenbank Werttypen ungleich Null enthielt, jedoch keinen Standardwert festgelegt hatte. Es gab mir zwei Möglichkeiten: 1) Wählen Sie jetzt einen einmaligen Wert oder 2) Beenden Sie und ändern Sie die Standardeinstellung in models.py. Ich habe die erste Option ausgewählt und den Standardwert 1 angegeben. Wiederholen Sie diesen Vorgang vier oder fünf Mal, bis die Eingabeaufforderung anzeigt, dass der Vorgang abgeschlossen ist. Ich rannte dann python manage.py migrate. Jetzt funktioniert es gut. Denken Sie daran, dass beim python manage.py makemigrationsersten Ausführen eine überarbeitete Kopie der Datenbank erstellt wird (meine war 0004) und Sie jederzeit zu einem vorherigen Datenbankstatus zurückkehren können.

Bradley
quelle
2

Ich habe den gleichen Fehler erhalten, als ich zum Admin-Panel ging. Sie sollten dies stattdessen ausführen : python manage.py migrate --run-syncdb. Vergessen Sie nicht, migrate einzuschließen , ich lief:

python manage.py make migrations und dann python manage.py migrate

Als der Fehler weiterhin bestand, versuchte ich es mit dem oben vorgeschlagenen Befehl.

Abhishek Thakur
quelle
1

Dies ist mir passiert und für mich war es, weil ich db.sqlite3als nicht verfolgt aus dem Repository hinzugefügt habe . Ich fügte es hinzu und schob es auf den Server, damit es richtig funktionierte. Laufen Sie auch makemigartionsund migratedanach.

Steev James
quelle
0

Ich verwende Django CMS 3.4 mit Django 1.8. Ich habe die Grundursache im Django CMS-Code durchgearbeitet. Die Hauptursache ist, dass das Django CMS das Verzeichnis nicht in das Verzeichnis mit der Datei ändert, die die SQLite3-Datenbank enthält, bevor Datenbankaufrufe ausgeführt werden. Die Fehlermeldung ist falsch. Das zugrunde liegende Problem besteht darin, dass ein SQLite-Datenbankaufruf im falschen Verzeichnis erfolgt.

Die Problemumgehung besteht darin, sicherzustellen, dass alle Ihre Django-Anwendungen das Verzeichnis wieder in das Stammverzeichnis des Django-Projekts ändern, wenn Sie in Arbeitsverzeichnisse wechseln.

Mybrid
quelle
0

Wenn Sie am Ende dieser Liste ankommen und diese Antwort finden, bin ich fast sicher, dass sie alle Ihre Probleme lösen wird :) In meinem Fall hatte ich eine Datenbanktabelle gelöscht und kam mit makemigrationsund nicht weitermigrate

Also habe ich eine sehr detaillierte Antwort bekommen, wie man alles über diesen Link zurücksetzt

Gakuo
quelle
0

Das, was für mich funktioniert hat:

  1. Finden Sie heraus, welche Migrationen in Ihrem Migrationsordner die Tabelle erstellt haben, wenn Sie die Klasse nicht in Ihrer models.py hinzufügen.
  2. Wenn die Klasse bereits in Ihrer models.py vorhanden ist, versuchen Sie, diese zu löschen und auszuführen python manage.py makemigrations <appname>
  3. Und während der Migration fälschen Sie, dass Migrationen als Ihr Fehler möglicherweise sagen, dass die Tabelle nicht gefunden wurde, um sie mit zu löschen python manage.py migrate <yourappname> --fake
  4. Fügen Sie die Klasse erneut hinzu und machen Sie erneut Auswanderungen python manage.py makemigrations <appname>.
  5. Und schließlich wieder migrieren python manage.py migrate <appname>
Salbei Poudel
quelle