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の主キーについて
MySQLで作成済のデータベースをDjangoで扱うためのコマンド inspectdb
について
コメント