64

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

これを読んだ後、これは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)にモデルを反映させる方法や、私が間違っていることを指摘する方法を提案できますか?

4

9 に答える 9

124

southプラグインなしのDjango移行の回答を更新しました:

TTが彼の回答で提案したように、私の以前の回答は、southDjangoにスキーマ移行機能がない場合の移行プラグインに関するものでした。現在(Django 1.9以降で動作します):

TT は書いた

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

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を繰り返します。

于 2012-10-08T16:44:31.117 に答える
94

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

python manage.py migrate --run-syncdb

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

于 2016-08-19T03:35:33.043 に答える
12

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

python manage.py makemigrations

その後、データベースを同期するためにmigrateコマンドを実行する必要があります。

python manage.py migrate --run-syncdb

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

于 2017-11-21T08:57:18.800 に答える
2

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

于 2012-10-08T16:05:39.580 に答える
2

多分あなたは試すことができると思います

python manage.py syncdb

sqlite3でさえ必要ですsyncdb

賢明なことに、あなたはあなたのSQLファイル名をチェックすることができます

xxx.s3dbのようになります

于 2013-08-10T16:46:45.253 に答える
2

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

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

于 2018-09-19T07:49:42.987 に答える
2

。最初のステップはdb.sqlite3ファイルを削除します。ターミナルに移動してコマンドを実行します。

  • python manage.py makemigrations
  • python manage.py migrate
  • python manage.py createsuperuser
  • python manage.py runserver 。管理ページに移動して、すべて問題ありません。
于 2020-07-06T19:37:23.290 に答える
0

最初の実行:python manage.py makemigrations
2番目の実行:python manage.py migrate

于 2021-05-04T10:26:58.937 に答える
-1
(1) delete -> db.sqlite3
(2) your App -> migrations directory-> delete all 001_initial.py and others but dont delete __init__.py

(3) open terminal -> 
python manage.py makemigrations
python manage.py migrate 
于 2021-03-21T23:41:43.207 に答える