[Django+MySQL] django.db.utils.OperationalError:(1054, “Unknown column ‘XXX.id’ in ‘field list'”)の解決法

記事内に広告が含まれています。

MySQLで作成したデータベースをDjangoに読み込ませて操作しようとした際に上記エラーが出てきました。MySQLに慣れてなくて手こずったので、備忘録の意味も込めて解決法を共有したいと思います。

結論:解決の方法

MySQLのテーブルに主キーが存在していなかったことが原因です。そのため、MySQLのテーブルに id という名前の主キーを追加することで解決できます。

エラーに出てきたテーブルをXXXとして、MySQLにて以下のコマンドを実行します。

ALTER TABLE XXX add id int AUTO_INCREMENT PRIMARY KEY;

このコマンドにより、テーブルに主キーが自動生成されてDjango側もテーブルを扱えるようになります。

発生の理由

一言で言えば、主キーの有無が問題の原因です。

Djangoでは、主キーが存在しないテーブルがあった場合、自動的に id という名前の主キーを作成します。

By default, Django gives each model an auto-incrementing primary key with the type specified per app

公式ドキュメント より抜粋

MySQLで作成済であったテーブルを以下のコマンドでDjangoに読み込ませました。

python manage.py inspectdb >> app/models.py

このコマンドを用いることで、自動的にDjangoのmodels.pyにMySQLのテーブルを書き込むことが可能です。

しかし、自分が作成したMySQLのテーブル(以下のコマンド参照)には主キーが存在していませんでした。

(データはダミーです。)

#定義したデータベースの例
create table table1(
    col1 char(100),
    col2 int
);

このテーブルの登録内容(ダミー)は以下の通りです。

#登録したデータの例
insert into table1 values ("カレールー", 1);
insert into table1 values ("玉ねぎ", 3);
insert into table1 values ("にんじん", 4);

#データの一覧
select * from table1;
+-----------------+------+
| col1            | col2 |
+-----------------+------+
| カレールー        |    1 | 
| 玉ねぎ           |    3 |
| にんじん         |    4 |
+-----------------+------+

したがって、表題のエラーは、『DjangoがMySQLのテーブルを見た時、 id というカラムがあるはずなのにそのカラムが存在していない』ことが原因と考えられます。

このテーブルにALTER コマンドを実行すると、id カラムが生成されます。

ALTER TABLE table1 add id int AUTO_INCREMENT PRIMARY KEY;

select * from table1;
+-----------------+------+----+
| col1            | col2 | id |
+-----------------+------+----+
| カレールー      |    1 |  1 |
| 玉ねぎ          |    3 |  2 |
| にんじん        |    4 |  3 |
+-----------------+------+----+

まとめ

MySQLで作成したデータベースをDjangoに読み込ませた際のエラーについて解説し、解決法を共有しました。少しでも役に立てば幸いです。

Djangoの主キーについて

モデル | Django ドキュメント
The web framework for perfectionists with deadlines.

MySQLで作成済のデータベースをDjangoで扱うためのコマンド inspectdb について

How to integrate Django with a legacy database | Django ドキュメント
The web framework for perfectionists with deadlines.

コメント