LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-18

「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は再起動しないと反映されないので注意しよう!!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0