Django
Python3
teratail

Djangoで初期のmigrateが出来ない。(`disk I/O error`)

More than 1 year has passed since last update.

「teratail」にも質問投げたんですが、文字数制限のせいで、追加情報が載せれなかったので、こっちにも書いておきます。

そもそも何で文字数制限あるんや...

Djangoで初期のmigrateが出来ない。(disk I/O error)


追記: 2018/05/18 14:55

原因っぽいもの見つけました。(まだ対処法までは見つかってませんが...)

「②makemigrationsしてから、migrate」でエラーとなっている以下の行から、contenttypesのSQLが怪しいと見ました。

Running migrations:

Applying contenttypes.0001_initial...Traceback (most recent call last):
File "/root/.virtualenvs/env1/lib/python3.6/site-packages/django/db/backends/base/base.py", line 239, in _commit
return self.connection.commit()
sqlite3.OperationalError: disk I/O error

そこで、python manage.py sqlmigarteにて、実行される各SQLを表示してみました。

$ python manage.py sqlmigrate contenttypes 0001

BEGIN;
--
-- Create model ContentType
--
CREATE TABLE "django_content_type" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(100) NOT NULL, "app_label" varchar(100) NOT NULL, "model" varchar(100) NOT NULL);
--
-- Alter unique_together for contenttype (1 constraint(s))
--
CREATE UNIQUE INDEX django_content_type_app_label_model_76bd3d3b_uniq ON "django_content_type" ("app_label", "model");
COMMIT;

以下のオペレーションを行ったところ、COMMIT;にてdisk I/O errorが発生しました。

# db.sqlite3を削除

$ rm db.sqlite3

# makemigrations
$ python manage.py makemigrations
No changes detected

# SQLite3に接続し、「contenttypes.0001_initial」で実行されるはずのSQLを手動で実行
$ sqlite3 db.sqlite3
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> --- tables内に何も無いことを確認
sqlite> .tables
sqlite> --- contenttypes.0001_initialで実行されるはずのSQLを手動で実行
sqlite> BEGIN;
sqlite> CREATE TABLE "django_content_type" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(100) NOT NULL, "app_label" varchar(100) NOT NULL, "model" varchar(100) NOT NULL);
sqlite> CREATE UNIQUE INDEX django_content_type_app_label_model_76bd3d3b_uniq ON "django_content_type" ("app_label", "model");
sqlite> COMMIT;
Error: disk I/O error

ちなみに、BEGINとCOMMITを付けなかったらエラーなく実行できます。

何でSQLite3でcommitするだけで、disk I/O errorになるんでしょう...


追記:SQLiteのBegin~Commit/Rollback

sqlite> -- テーブル作ってみる

sqlite> begin;
sqlite> create table dummy (id, name);
sqlite> commit;
Error: disk I/O error
sqlite> -- disk IO error発生した....
sqlite>
sqlite> -- しかも何故か、生成は成功してる...
sqlite> .tables
dummy
sqlite> -- ロールバックはうまくいく
sqlite> begin;
sqlite> drop table dummy;
sqlite> rollback;
sqlite> .tables
dummy
sqlite> -- コミットは例のごとくerrorになるのに、処理自体は成功する....
sqlite> begin;
sqlite> drop table dummy;
sqlite> commit;
Error: disk I/O error
sqlite> .tables
sqlite>

何なんだ、お前は.....


追記:解決!!!

SELinuxが影響してました。

disabledじゃないとダメみたいです。

getenforceで確認したらdisabledだったから安心しきってたけど、

再起動してなかったのかな...分からんち。

SELinuxは再起動しないと反映されないので注意しよう!!!