web-dev-qa-db-fra.com

Django: OperationalError Aucune table de ce type

Je construis une application assez simple, la recherche, dans mon projet Django qui utilise Django-CMS. (C'est ma première tentative de projet/application.) Son objectif principal est de stocker divers actifs intellectuels (par exemple, un article, un livre, etc. écrit par un chercheur). 

Le problème est que lorsque je pointe le navigateur sur/research/j'obtiens une erreur en disant que la table 'research_journal' n'existe pas ("pas de telle table").

J'utilise Djnago 1.6.5 avec une base de données sqlite3.

En regardant python manage.py sql research, vous obtenez:

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;

J'ai exécuté python manage.py migrate research et j'ai:

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

J'ai exécuté python manage.py syncdb et ai obtenu ce qui suit:

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)

Voici le 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)

Voici mon point de vue.

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

Voici l'url.py de l'application:

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

Voici le modèle 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 %}

Juste au cas où cela importerait, voici mon 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)

Pensées? Toute aide serait grandement appréciée.

36
Brian

On dirait qu'il y a eu un problème avec ma migration.

J'ai exécuté ./manage.py schemamigration research --auto et constaté que de nombreux champs n'avaient pas de valeur par défaut spécifiée.

Donc, j'ai couru ./manage.py schemamigration research --init suivi de ./manage.py migrate research

Réexécuter le serveur à partir de là a fait l'affaire!

14
Brian

Ce commentaire sur cette page a fonctionné pour moi et quelques autres. Il mérite sa propre réponse:

python manage.py migrate --run-syncdb
88
guaka

Pour Django 1.10, vous devrez peut-être faire python manage.py makemigrations appname.

21
Stryker

J'utilise Django 1.9, SQLite3 et DjangoCMS 3.2 et j'ai le même problème. Je l'ai résolu en exécutant python manage.py makemigrations. Cela a été suivi d'une invite indiquant que la base de données contenait des types de valeur non null, mais qu'aucune valeur par défaut n'était définie. Cela me donnait deux options: 1) sélectionner une valeur unique maintenant ou 2) quitter et changer le paramètre par défaut dans models.py. J'ai sélectionné la première option et donné la valeur par défaut de 1. Cette opération a été répétée quatre ou cinq fois jusqu'à ce que l'invite indique qu'elle est terminée. J'ai ensuite couru python manage.py migrate. Maintenant cela fonctionne très bien. N'oubliez pas qu'en exécutant d'abord python manage.py makemigrations, une copie révisée de la base de données est créée (la mienne date de 0004) et vous pouvez toujours revenir à un état précédent de la base de données.

2
Bradley

Le problème peut être résolu en exécutant des migrations.

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

effectuez les opérations ci-dessus chaque fois que vous apportez des modifications dans models.py.

2

Cette erreur survient lorsque vous n'avez pas effectué de migration vers la table que vous venez de créer, Ainsi, commencez par écrire la commande sur cmd en tant que: python manage.py makemigrations, puis écrivez une autre commande pour appliquer ces migrations effectuées par la commande makemigrations: python manage.py migrate

1

Cela m'est arrivé et pour moi c'est parce que j'ai ajouté db.sqlite3 comme non suivi du référentiel. Je l'ai ajouté et poussé sur le serveur afin que cela fonctionne correctement. Exécutez également makemigartions et migrate après avoir exécuté cela.

0
Steev James

J'utilise Django CMS 3.4 avec Django 1.8 . J'ai expliqué la cause principale dans le code Django CMS . La cause première est que le Django CMS ne change pas de répertoire dans le répertoire avec le fichier contenant la base de données SQLite3 avant de créer appels de base de données. Le message d'erreur est parasite. Le problème sous-jacent est qu'un appel à la base de données SQLite est effectué dans le mauvais répertoire.

La solution consiste à s'assurer que toutes vos applications Django reviennent dans le répertoire racine du projet Django lorsque vous passez aux répertoires de travail. 

0
mybrid