web-dev-qa-db-ja.com

djangoそのようなテーブルはありません:

モデルはDjango以下のように設定されています。

class Pupil(models.Model):
    forename = models.CharField(max_length=30)
    surname = models.CharField(max_length=30)
    dateofbirth = models.DateField()
    year = models.IntegerField()
    class_group = models.CharField(max_length=30)
    email = models.EmailField(blank=True)
    assignments = models.ManyToManyField('Assignment', verbose_name='related assignments')

    def __unicode__(self):
        return u'%s %s' % (self.forename, self.surname)

class Subject(models.Model):
    name = models.CharField(max_length=30)
    level = models.CharField(max_length=30)
    teachers = models.ManyToManyField('Teacher', verbose_name='related teachers')

    def __unicode__(self):
        return self.name

class Teacher(models.Model):
    forename = models.CharField(max_length=30)
    surname = models.CharField(max_length=30)
    email = models.EmailField(blank=True)

    def __unicode__(self):
        return u'%s %s' % (self.forename, self.surname)

class Assignment(models.Model):
    assignment_name = models.CharField(max_length=30)
    date_assigned = models.DateField()
    date_submitted = models.DateField()

    def __unicode__(self):
        return self.assignment_name

生徒を追加して、管理者の生徒に課題を添付しようとすると、データベースエラーが表示されます-

no such table: homework_pupil_assignments

this を読んだ後、これはDjango=私がmanage.py sqlall homework

次が表示されます。

BEGIN;
CREATE TABLE "homework_pupil_assignments" (
    "id" integer NOT NULL PRIMARY KEY,
    "pupil_id" integer NOT NULL,
    "assignment_id" integer NOT NULL,
    UNIQUE ("pupil_id", "assignment_id")
)
;
CREATE TABLE "homework_pupil" (
    "id" integer NOT NULL PRIMARY KEY,
    "forename" varchar(30) NOT NULL,
    "surname" varchar(30) NOT NULL,
    "dateofbirth" date NOT NULL,
    "year" integer NOT NULL,
    "class_group" varchar(30) NOT NULL,
    "email" varchar(75) NOT NULL
)
;
CREATE TABLE "homework_subject_teachers" (
    "id" integer NOT NULL PRIMARY KEY,
    "subject_id" integer NOT NULL,
    "teacher_id" integer NOT NULL,
    UNIQUE ("subject_id", "teacher_id")
)
;
CREATE TABLE "homework_subject" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(30) NOT NULL,
    "level" varchar(30) NOT NULL
)
;
CREATE TABLE "homework_teacher" (
    "id" integer NOT NULL PRIMARY KEY,
    "forename" varchar(30) NOT NULL,
    "surname" varchar(30) NOT NULL,
    "email" varchar(75) NOT NULL
)
;
CREATE TABLE "homework_assignment" (
    "id" integer NOT NULL PRIMARY KEY,
    "assignment_name" varchar(30) NOT NULL,
    "date_assigned" date NOT NULL,
    "date_submitted" date NOT NULL
)
;
COMMIT;

次に、これらのテーブルが正常に同期されることを期待して、既存のアプリを起動して実行するための指示に従ってSouthをインストールしました。喜びはありません。

誰も私がデータベース(sqlite3)を取得してモデルを反映する方法を提案したり、私が間違っていることを指摘したりできますか?

40
puffin

Django southプラグインを使用しない移行:

TT で提案された answer のように、以前の回答はsouth移行プラグインに対するものでした。Djangoが何もなかったときスキーマ移行機能。今(Django 1.9+で動作):

T.Twrote

これを試すことができます!

python manage.py makemigrations

python manage.py migrate --run-syncdb

south移行プラグインでは時代遅れ

私はあなたがそれをすべて間違った順序で実行したことがわかるように、それを修正するには、このチェックリストを完了する必要があります(最初からsqlite3データベースファイルを削除できないと仮定します):

  1. SQLite GUIツールを取得します(つまり http://sqliteadmin.orbmu2k.de/
  2. データベース定義と一致するようにモデル定義を変更します(最良のアプローチは、新しいフィールドをコメントすることです)
  3. モデルのmigrationsフォルダーを削除します
  4. south_migrationhistoryテーブルの行を削除します。app_nameはアプリケーション名(おそらくhomework)と一致します
  5. 呼び出し:./manage.py schemamigration <app_name> --initial
  6. ./manage.py migrate <app_name> --fakeでテーブルを作成します(テーブルがデータベースに既に存在するため、--fakeはSQL実行をスキップします)
  7. アプリのモデルを変更する
  8. ./manage.py schemamigration <app_name> --autoを呼び出します
  9. 次に、データベースに変更を適用します:./manage.py migrate <app_name>

モデルに変更が必要な場合は、手順7、8、9が繰り返されます。

56
WBAR

これを試すことができます!

python manage.py migrate --run-syncdb

Django 1.9と1.10でも同じ問題があります。このコードは機能します!

73
T.T

Django 2.xまたは1.11.xの最新バージョンを使用している場合、まず移行を作成する必要があります。

python manage.py makemigrations

その後、データベースを同期するためにmigrateコマンドを実行するだけです。

python manage.py migrate --run-syncdb

これらはデータベースとpythonモデルを同期し、2番目のコマンドはその背後にあるすべてのSQLを出力します。

5
Shubham Sharma

sqlallはSQLを出力するだけで、実行はしません。 syncdbは、まだ作成されていないテーブルを作成しますが、既存のテーブルを変更しません。

2
Daniel Roseman

データベースをDjangoモデルに同期する1つの方法は、データベースファイルを削除してmakemigrationsを実行し、コマンドを再度移行することです。これはDjango=データベースを最初から作成しますが、レコードが必要な場合に備えて、削除する前にデータベースファイルをバックアップしてください。

私はデータにあまり煩わされておらず、データベースとモデルの構造を同期させたいだけだったので、このソリューションはうまくいきました。

1
Lakshadeep

たぶん試してみることができると思う

python manage.py syncdb

でもsqlite need syncdb

sencndly、あなたはあなたのSQLファイル名を確認することができます

xxx.s3dbのように見えるはずです

1
creepyuncle