2014-09-10 25 views
20

Buduję dość prostą aplikację, badania w moim projekcie Django, który używa Django-CMS. (Jest to moja pierwsza inicjatywa w projekcie/aplikacji.) Głównym celem jest przechowywanie różnych zasobów intelektualnych (np. Artykułu, książki itp. Napisanych przez badacza).Django: OperationalError No Such Table

Problem polega na tym, że kiedy kieruję przeglądarkę do/research /, otrzymuję komunikat o błędzie z informacją, że tabela "research_journal" nie istnieje ("brak takiej tabeli").

Używam Djnago 1.6.5 z bazą danych sqlite3.

Patrząc na python manage.py sql research plonów:

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; 

Zabrakło mi python manage.py migrate research i otrzymujemy:

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

Zabrakło mi python manage.py syncdb i uzyskać następujące:

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) 

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

Oto mój views.py (uwaga, że ​​jestem przejściu dwóch obiektów poprzez render, ignorować faktu, że mam jeszcze zawierać Książki klasa w całej Deal):

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

Oto adres URL aplikacji .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'), 
) 

Oto szablon 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 %} 

Na wszelki wypadek, to jest moje 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) 

Myśli? Każda pomoc będzie bardzo ceniona.

+0

Czy uruchomiłeś python manage.py syncdb? – jabez

+0

Tak. Uruchomiłem program python manage.py syncdb (dodałem wynik do posta). Miałem wrażenie, że korzystanie z migracji na południu eliminuje potrzebę synchronizacji bazy danych za pomocą wspomnianego polecenia. Czy to jest nieprawidłowe? – Brian

+0

Czy próbowałeś ponownie upuścić DB i syncDB? – ppolak

Odpowiedz

9

Wygląda na to, że wystąpił problem z moją migracją.

Uruchomiłem ./manage.py schemamigration research --auto i odkryłem, że wiele pól nie ma określonych wartości domyślnych.

Więc wpadłem ./manage.py schemamigration research --init następnie ./manage.py migrate research

Ponowne uruchamianie serwera stamtąd załatwiło sprawę!

+15

'manage.py migrate --run-syncdb' pracował dla mnie – erbdex

0

Używam Django 1.9, SQLite3 i DjangoCMS 3.2 i miałem ten sam problem. Rozwiązałem go, uruchamiając python manage.py makemigrations. Następnie pojawiła się informacja, że ​​baza danych zawiera typy o wartości innej niż null, ale nie ma wartości domyślnej. Dało mi dwie opcje: 1) wybierz jednorazową wartość teraz lub 2) zakończ i zmień domyślne ustawienie w models.py. Wybrałem pierwszą opcję i dałem domyślną wartość 1. Powtórzyć to cztery lub pięć razy, aż do monitu, że zostało zakończone. Następnie uruchomiłem python manage.py migrate. Teraz działa dobrze. Pamiętaj, uruchamiając najpierw python manage.py makemigrations, tworzona jest poprawiona kopia bazy danych (moja była 0004) i zawsze możesz powrócić do poprzedniego stanu bazy danych.

51

This comment na tej stronie działało dla mnie i dla kilku innych osób.Zasługuje na własną odpowiedź:

python manage.py migrate --run-syncdb 
+0

Nie zapomnij najpierw uruchomić' makroprocedury python' –

0

Używam Django CMS 3.4 z Django 1.8. Przeszedłem przez główną przyczynę w kodzie Django CMS. Głównym powodem jest to, że Django CMS nie zmienia katalogu do katalogu z plikiem zawierającym bazę danych SQLite3 przed wywołaniem bazy danych. Komunikat o błędzie jest fałszywy. Podstawowy problem polega na tym, że wywołanie bazy danych SQLite jest wykonywane w niewłaściwym katalogu.

Obejście problemu polega na zapewnieniu, że wszystkie aplikacje Django zmieniają katalog z powrotem na katalog główny projektu Django po przejściu na katalogi robocze.

12

Dla django 1.10 może być konieczne wykonanie python manage.py makemigrations appname.