モデルは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)を取得してモデルを反映する方法を提案したり、私が間違っていることを指摘したりできますか?
south
プラグインを使用しない移行:TT で提案された answer のように、以前の回答はsouth
移行プラグインに対するものでした。Djangoが何もなかったときスキーマ移行機能。今(Django 1.9+で動作):
これを試すことができます!
python manage.py makemigrations python manage.py migrate --run-syncdb
south
移行プラグインでは時代遅れ私はあなたがそれをすべて間違った順序で実行したことがわかるように、それを修正するには、このチェックリストを完了する必要があります(最初からsqlite3データベースファイルを削除できないと仮定します):
- SQLite GUIツールを取得します(つまり http://sqliteadmin.orbmu2k.de/ )
- データベース定義と一致するようにモデル定義を変更します(最良のアプローチは、新しいフィールドをコメントすることです)
- モデルの
migrations
フォルダーを削除しますsouth_migrationhistory
テーブルの行を削除します。app_name
はアプリケーション名(おそらくhomework
)と一致します- 呼び出し:
./manage.py schemamigration <app_name> --initial
./manage.py migrate <app_name> --fake
でテーブルを作成します(テーブルがデータベースに既に存在するため、--fake
はSQL実行をスキップします)- アプリのモデルを変更する
./manage.py schemamigration <app_name> --auto
を呼び出します- 次に、データベースに変更を適用します:
./manage.py migrate <app_name>
モデルに変更が必要な場合は、手順7、8、9が繰り返されます。
これを試すことができます!
python manage.py migrate --run-syncdb
Django 1.9と1.10でも同じ問題があります。このコードは機能します!
Django 2.xまたは1.11.xの最新バージョンを使用している場合、まず移行を作成する必要があります。
python manage.py makemigrations
その後、データベースを同期するためにmigrateコマンドを実行するだけです。
python manage.py migrate --run-syncdb
これらはデータベースとpythonモデルを同期し、2番目のコマンドはその背後にあるすべてのSQLを出力します。
sqlall
はSQLを出力するだけで、実行はしません。 syncdb
は、まだ作成されていないテーブルを作成しますが、既存のテーブルを変更しません。
データベースをDjangoモデルに同期する1つの方法は、データベースファイルを削除してmakemigrationsを実行し、コマンドを再度移行することです。これはDjango=データベースを最初から作成しますが、レコードが必要な場合に備えて、削除する前にデータベースファイルをバックアップしてください。
私はデータにあまり煩わされておらず、データベースとモデルの構造を同期させたいだけだったので、このソリューションはうまくいきました。
たぶん試してみることができると思う
python manage.py syncdb
でもsqlite need syncdb
sencndly、あなたはあなたのSQLファイル名を確認することができます
xxx.s3dbのように見えるはずです