Django Rest Framework のテストでハマったこと (4)

Published: 2021-10-02 16:00 +0900 by Chirimen

Django で既存データベースから inspectdb で作成した models.my は managed = False となっている。 そのままだと test を実行したときに、 テスト用データベースにモデルに対応したテーブルが作成されない。

inspectdb による既存データベースの利用

既存のデータベースを Django で使用するとき、 データベースに対応したモデル定義を python managed.py inspectdb で取得することができる (Integrating Django with a legacy database, [Django]既存のデータベースを利用する方法)。

python managed inspectdb > models.py

このとき取得したモデル定義は、 managed = False となっている。 既存データベースだから Django 側からテーブル定義を変更しない、 ということでこういう設定なのだろう。

    class Meta:
        managed = False

テスト実行時のエラー (Table doesn’t exist)

サーバは特に支障なく動いていたのだが、 テストを実行する習慣をつけようとテストコードを書いて python manage.py test を実行すると、 “Table ‘test_XXX.XXX’ doesn’t exitst” のエラーが。

django.db.utils.ProgrammingError: (1146, "Table 'test_XXX.XXX' doesn't exist")

--keepdb でデータベースの内容を確認すると、 モデル定義に対応したテーブルが作成されていない。

そもそも migrations が空なので、作成されていないのだ。

makemigration (本番環境では不要) を実行

python manage.py makemigrations を実行して、 migrations にファイル 0001_initial.py ができていることを確認してから、 再度 python manage.py test

“Table ‘test_XXX.XXX’ doesn’t exitst”

モデル定義を managed = True にしてから makemigration

これは models.py で managed = False のままになっていたことを忘れていたせい。

managed = True に書き換えて python manage.py makemigrations 実行。 今度は migrations にファイル 0002_auto_XXXXXXXX_XXXX.py が作成された。

再々度 python manage.py test

“Table ‘test_XXX.XXX’ doesn’t exitst”。

やはりテーブルは作成されていない。

[解決] migrations のファイルをクリアしてから makemigration をやり直し

よくわからないが初回のマイグレーションファイル 0001_initial.pymanaged: False に設定されたモデルは、 後続のマイグレーションファイルで managed: True となっても無視されてしまうようだ。

マイグレーションファイルをすべて消去して、 makemgigrations をやり直すとテスト実行時にテーブルが作成されるようになった。

その他

かつて DjangoTestSuiteRunner のサブクラスでテスト時に managed の設定を書き換える方法 が提案されていたようだが、 後継の DiscoverRunner でやってみたけど機能しない ようである。

モデルの _meta.managed を設定する方法 も試してみたけど機能しなかった。

Share

Latest Posts

Django Rest Framework のテストでハマったこと (4)

Django で既存データベースから inspectdb で作成した models.my は managed = False となっている。 そのままだと test を実行したときに、 テスト用データベースにモデルに対応したテーブルが作成されない。

Django Rest Framework のテストでハマったこと (3)

factory_boy の Faker() で、 取得した値を加工してから使用する話。

Django Rest Framework のテストでハマったこと (2)

Django のテスト用データを作成するのによく用いられる factory_boy で locale を指定して日本語圏用のデータを利用する話。