web-dev-qa-db-ja.com

OperationalError、そのような列はありません。 Django

私はDjangoが初めてで、エラーなしでdjangoproject.comのチュートリアルを完了することができました。現在、Django REST http://www.Django-rest-framework.org/)にあるフレームワークチュートリアル 私はこれでほぼ終了し、認証を追加しました。

_OperationalError at /snippets/
no such column: snippets_snippet.owner_id
Request Method: GET
Request URL:    http://localhost:8000/snippets/
Django Version: 1.7
Exception Type: OperationalError
Exception Value:    
no such column: snippets_snippet.owner_id
Exception Location: /Users/taylorallred/Desktop/env/lib/python2.7/site-packages/Django/db/backends/sqlite3/base.py in execute, line 485
Python Executable:  /Users/taylorallred/Desktop/env/bin/python
Python Version: 2.7.5
Python Path:    
['/Users/taylorallred/Desktop/tutorial',
 '/Users/taylorallred/Desktop/env/lib/python27.Zip',
 '/Users/taylorallred/Desktop/env/lib/python2.7',
 '/Users/taylorallred/Desktop/env/lib/python2.7/plat-darwin',
 '/Users/taylorallred/Desktop/env/lib/python2.7/plat-mac',
 '/Users/taylorallred/Desktop/env/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/taylorallred/Desktop/env/Extras/lib/python',
 '/Users/taylorallred/Desktop/env/lib/python2.7/lib-tk',
 '/Users/taylorallred/Desktop/env/lib/python2.7/lib-old',
 '/Users/taylorallred/Desktop/env/lib/python2.7/lib-dynload',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/taylorallred/Desktop/env/lib/python2.7/site-packages']
Server time:    Sat, 11 Oct 2014 07:02:34 +0000
_

私はソリューションのStackOverflowだけでなく、ウェブ上のいくつかの場所を調べましたが、一般的に問題は私のデータベースにあり、それを削除してから再作成する必要があるようです、私はこれを数回行いました、チュートリアルにも私がいますデータベースを削除し、その時点でリメイクします。これが私の_models.py_です:

_from Django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles
from pygments.lexers import get_lexer_by_name
from pygments.formatters.html import HtmlFormatter
from pygments import highlight


LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())



class Snippet(models.Model):
    owner = models.ForeignKey('auth.User', related_name='snippets')
    highlighted = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES,
                                            default='python',
                                            max_length=100)
    style = models.CharField(choices=STYLE_CHOICES,
                                     default='friendly',
                                     max_length=100)
    class Meta:
        ordering = ('created',)
def save(self, *args, **kwargs):
    """
    Use the 'pygments' library to create a highlighted HTML
    representation of the code snippet.
    """
    lexer = get_lexer_by_name(self.language)
    linenos = self.linenos and 'table' or False
    options = self.title and {'title': self.title} or {}
    formatter = HtmlFormatter(style=self.style, linenos=linenos,
                                      full=true, **options)
    self.highlighted = highlight(self.code, lexer, formatter)
    super(Snippet, self).save(*args, **kwargs)
_

私の_serializers.py_:

_from Django.forms import widgets
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
from Django.contrib.auth.models import User



class SnippetSerializer(serializers.ModelSerializer):
    owner = serializers.Field(source='owner.username')
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style', 'owner')


class UserSerializer(serializers.ModelSerializer):
    snippets = serializers.PrimaryKeyRelatedField(many=True)


    class Meta:
        model = User
        fields = ('id', 'username', 'snippets')
_

私の_views.py_:

_from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics
from Django.contrib.auth.models import User
from snippets.serializers import UserSerializer
from rest_framework import permissions

class SnippetList(generics.ListCreateAPIView):
    """
    List all snippets, or create a new snippet.
    """
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    def pre_save(self, obj):
        obj.owner = self.request.user
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    """
    Retrieve, update or delete a nippet instance.
    """
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    def pre_save(self, obj):
        obj.owner = self.request.user
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetail(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
_

そして最後に私の_urls.py_

_from Django.conf.urls import include
from Django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views


urlpatterns = patterns('',
    url(r'^snippets/$', views.SnippetList.as_view()),
    url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
    url(r'^users/$', views.UserList.as_view()),
    url(r'^users/(?P<pk>[0-9]+)/$', views.UserDetail.as_view()),
)

urlpatterns = format_suffix_patterns(urlpatterns)

urlpatterns += patterns('',
    url(r'^api-auth/', include('rest_framework.urls',
                                       namespace='rest_framework')),
)
_

たくさんの不要な情報を投稿してしまったことをおaびします。事前に感謝します。

編集:DBスキーマ:

_CREATE TABLE "snippets_snippet" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, 
"created" datetime NOT NULL, "title" varchar(100) NOT NULL, "code" text NOT NULL, 
"linenos" bool NOT NULL, "language" varchar(100) NOT NULL, "style" varchar(100) NOT NULL);
_

掘り下げた後、_make migrations_コマンドを使用する代わりにDBを削除して再作成すると(チュートリアルの説明どおり)、列を追加するだけでなく、実行中に問題が発生したこともわかりません_make migrations_コマンドはそれを教えてくれます:

_You are trying to add a non-nullable field 'highlighted' to snippet without a default;
we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
_

_models.py_のhighlightedセクションをコメントアウトすると、上記と同じメッセージがowner行に対して投稿されます。そのため、highlightedownerの両方にデフォルトが必要ですが、それをどのように使用するかはわかりません。チュートリアルと同じように私も助けてくれません。

35
TaylorAllred

チュートリアルを進めていくと、Django 1.7

Django 1.7より前は、syncdbコマンドは、データベース内の現在のデータを破壊する可能性のある変更を一切行いませんでした。つまり、モデルに対してsyncdbを実行し、モデル(事実上、新しい列)、syncdbはデータベースのその変更に影響しません。

そのため、そのテーブルを手動で削除してからsyncdbを再度実行して(ゼロから再作成し、データを失いました)、データベースに正しいステートメントを手動で入力してその列のみを追加しました。

次に、移行を実装するsouthというプロジェクトが登場しました。これは、データベースへの変更を順方向に(および逆方向に、元に戻す)移行し、データの整合性を保持する方法があることを意味していました。

Django 1.7では、southの機能はDjangoに直接統合されました。移行を使用する場合、プロセスは少し異なります。

  1. _models.py_を変更します(通常どおり)。
  2. 移行を作成します。これにより、モデルの現在の状態から次の状態に進むコードが生成されます。これはmakemigrationsコマンドで実行されます。このコマンドは、何が変更されたかを検出するのに十分スマートであり、データベースへの変更を有効にするスクリプトを作成します。
  3. 次に、migrateを使用してその移行を適用します。このコマンドは、すべての移行を順番に適用します。

したがって、通常のsyncdbは、2段階のプロセス、_python manage.py makemigrations_に続いて_python manage.py migrate_になります。

次に、特定の問題について説明します。

_class Snippet(models.Model):
    owner = models.ForeignKey('auth.User', related_name='snippets')
    highlighted = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES,
                                            default='python',
                                            max_length=100)
    style = models.CharField(choices=STYLE_CHOICES,
                                     default='friendly',
                                     max_length=100)
_

このモデルには、必須の2つのフィールドhighlightedcodeがあります(nullにすることはできません)。

これらのフィールドを最初から追加した場合、テーブルに既存の行がないため問題はありませんか?

ただし、テーブルがすでに作成されており、nullにできないフィールドを追加する場合は、既存の行に提供するデフォルト値を定義する必要があります。そうしないと、データベースはデータ整合性制約に違反するため変更を受け入れません。

これがコマンドのプロンプトです。 Django=に移行中にデフォルトを適用するように指示するか、モデル自体に「空の」デフォルトhighlighted = models.TextField(default='')を指定できます。

40
Burhan Khalid

エラーに焦点を当てましょう:

例外値:そのような列はありません:snippets_snippet.owner_id

それが本当かどうか見てみましょう...

Manage.pyコマンドを使用して dbシェルにアクセス (これはsettings.py変数を使用するので、必ず正しいものに接続してください)。

manage.py dbshel​​l

次のように入力して、テーブルの詳細を表示できます。

.schema TABLE_NAME

またはあなたの場合:

.schema snippets_snippet

より多くのsqliteコマンドを見つけることができます here または以下を発行することにより:

。助けて

最後に、次のように入力してセッションを終了します。

。終了する

これは森から抜け出すことはできませんが、問題のどの端に取り組むべきかを知るのに役立ちます:)

幸運を!

8

ここでも同じ問題があり、同じエラーが発生しています。同じエラーを経験する将来のユーザーのためにこれを書きたいです。 @Burhan Khalidが言ったようにクラススニペットモデルに変更を加えた後、テーブルを移行する必要があります。

python manage.py makemigrations snippets
python manage.py migrate

これでエラーが解決するはずです。楽しい。

6
copser

このエラーは、views.pyなどで、そのテーブルに依存するクラスをインスタンス化した場合に発生する可能性があります。

4
marw

このタイプの問題を解決する最も直接的な方法は、次の3つのステッププロセスです。

  1. アプリの移行フォルダ/ディレクトリからすべての移行関連ファイルを削除します(これらは基本的に0000、0001、0002などで始まります)。

  2. db.sqliteという名前の既存のデータベースファイルをAppディレクトリから削除/名前変更します。

  3. 次のコマンドを実行します。

    python manage.py migrate

    最後に実行

    python manage.py createsuperuser

    管理タスクを実行します(必要な場合)。

3
hygull

Burhan Khalidの回答と移行に関するコメントから得たものです。私にとっては、「移行」フォルダーの内容をデータベースとともに削除してから、manage.py migrateを実行しました。移行フォルダーにテーブル構造に関する情報が保存されているため、データベースを削除するだけでは不十分です。

0
user3540774

ステップ1:db.sqlite3ファイルを削除します。

ステップ2:$ python manage.py migrate

ステップ3:$ python manage.py makemigrations

ステップ4:$ python manage.py createsuperuserを使用してスーパーユーザーを作成する

新しいdb.sqlite3は自動的に生成されます

0
user11567783

移行フォルダー内にpycacheフォルダーが隠されていることを覚えておいてください。モデルを変更してすべての移行ファイルを削除する場合は、pycacheフォルダーも削除する必要があります。

削除すべきでないのは、initファイルのみです。

お役に立てれば

0

あなたはすべて正しいことをした、私は同じ問題を経験した。最初にデータベースと移行を削除しますmakemigrationsでアプリの追加名を解決しました:

python manage.py makemigrations appname
python manage.py migrate

これは間違いなく機能します。

0
Dev Jalla

リシケシに同意する。私もこの問題を長い間解決しようとしました。これは、2つの方法のいずれかまたは両方で解決されます。

1.アプリの移行フォルダー内の移行を削除してみて(init。pyを除く)、makemigrationsコマンドを実行します

2.それがうまくいかない場合は、モデルの名前を変更してみてください(これが最後の手段であり、少し厄介になるかもしれませんが、確かに動作します。IfDjango Nを押してください。」)。

0
Priyank Kodesia

私はこの問題に直面し、これが私がそれを解決した方法です。

1)アプリの移行ディレクトリからすべての移行レコードを削除します。これらは0001_、0002_、0003_などの名前のファイルです。_init__。pyファイルを削除しないように注意してください。

2)db.sqlite3ファイルを削除します。後で再生成されます。

ここで、次のコマンドを実行します。

python manage.py makemigrations appname
python manage.py migrate

移行後にアプリの名前を必ず書いてください。データベースに再度アクセスするには、スーパーユーザーを作成する必要があります。次のようにしてください

python manage.py createsuperuser
0
Mayank Khanna

私も同じ問題に直面しています。

新しいフィールドを追加する場合、列が見つからないというエラーが表示されます。

次に、make migrationコマンドとその後のmigrateコマンドその後も同じエラー.. EX ...

 path=models.FilePathField()

フィールドのデフォルト値を追加

  path=models.FilePathField(default='')

適用コマンドより

  python manage.py makemigrations

  python manage.py migrate

あなたを助けるかもしれません

0
Abhimanyu Gaurh

あなたの問題が私のものの場合、これは回避策です。良いニュースは、データベースを削除する必要がないことです。

このモデルを参照として使用する他のモデルがないことを確認してください。

Django.db.utils.OperationalError: no such column: parts_part_type.blah

これは、この製品を参照する「製品」と呼ばれる別のアプリに「製品」と呼ばれる別のモデルがあったために、私にのみ起こりました。

part = models.ForeignKey("parts.Part", related_name="some part", limit_choices_to={'part_type':Part_Type.objects.get(prefix='PART')},)

私の解決策は:

  1. settings.pyから他のアプリ(この場合はprodcuts)をコメントアウトします
  2. python manage.py makemigrations; python manage.py migrate
  3. 他のアプリのコメントを解除して、再度有効にします。
  4. python manage.py makemigrations; python manage.py migrate

技術的には、limit_choices_to参照

0
SpiRail

最初に、これらのエラーを引き起こしている新しいフィールドをコメントし、python manage.py makemigrationsを実行してからpython manage.py migrateを実行して、これらの新しいフィールドを実際に削除します。

class FootballScore(models.Model):
    team = models.ForeignKey(Team, related_name='teams_football', on_delete=models.CASCADE)
    # match_played = models.IntegerField(default='0')
    # lose = models.IntegerField(default='0')
    win = models.IntegerField(default='0')
    # points = models.IntegerField(default='0')

class FootballScore(models.Model):
    team = models.ForeignKey(Team, related_name='teams_football', on_delete=models.CASCADE)
    match_played = models.IntegerField(default='0')
    lose = models.IntegerField(default='0')
    win = models.IntegerField(default='0')
    points = models.IntegerField(default='0')

次に、コメントを外して、python manage.py makemigrationspython manage.py migrateとboomを実行します。それは私のために働いた。 :)

0
Aadil Hoda