質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4459閲覧

DjangoでMySQLdb._exceptions.OperationalErrorが出てしまう

HajimeHamada

総合スコア20

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/08/14 10:02

編集2020/08/15 04:59

Django2.2.5(Python3.7.7)を使って、簡単なWebアプリケーションを作成しています。データベースはMySQL5.7.27を使っております。

models.pyに以下の二行を追加し、

Python

1magazine = models.CharField(verbose_name="雑誌名", max_length=511, blank=True) 2volume = models.CharField(verbose_name="巻・号", max_length=63, blank=True)

python3 manage.py makemigrationsを実行したところ、

_mysql.connection.query(self, query) MySQLdb._exceptions.OperationalError: (1054, "Unknown column 'reference.magazine' in 'field list'")

というエラーが出てしまいます。reference.magazineは今から追加してほしいフィールドなので、ないのは当たり前なのですが、今まではmodels.pyに必要なカラムを追加してmakemigrationsすればカラム追加ができていたため、なぜ今回はエラーになってしまうかがわかりません。manage.py自体のエラーらしく、python3 manage.py runserverなども同じエラーで実行できません。

試したことは、

  • migrationsディレクトリ内のファイルを、__init__.py以外全て消して、python3 manage.py makemigrationsのやり直し → 状態変わらず
  • 追加した2行を消して、python3 manage.py makemigrations → 問題なく実行可能
  • 2行追加ではなく、試しに他のフィールドのmax_lengthを変更して、migrate → 問題なく実行可能

という感じです。

初期データなどをかなり入力したので、DatabaseをDropしてやり直すのはできれば避けたいと思い、質問させていただく次第です。もし原因にお心当たりがありましたら、ご教示をよろしくお願いいたします。

[追記]
2行の追加をやめて、python3 manage.py showmigrationsした場合の出力を追記します。

admin [X] 0001_initial [X] 0002_logentry_remove_auto_add [X] 0003_logentry_add_action_flag_choices auth [X] 0001_initial [X] 0002_alter_permission_name_max_length [X] 0003_alter_user_email_max_length [X] 0004_alter_user_username_opts [X] 0005_alter_user_last_login_null [X] 0006_require_contenttypes_0002 [X] 0007_alter_validators_add_error_messages [X] 0008_alter_user_username_max_length [X] 0009_alter_user_last_name_max_length [X] 0010_alter_group_name_max_length [X] 0011_update_proxy_permissions contenttypes [X] 0001_initial [X] 0002_remove_content_type_name examples [X] 0001_initial [X] 0002_auto_20200814_1832 sessions [X] 0001_initial

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

llr114

2020/08/14 10:59

python3 manage.py showmigrations を実行した結果を見せていただいてもいいですか?
HajimeHamada

2020/08/14 23:23

ご返事遅くなり、もうしわけありません。manage.py自体がうまく動かない状態のようで、python3 manage.py showmigrationsしても、上と同じ、MySQLdb._exceptions.OperationalError が出てしまいます。
llr114

2020/08/15 04:54

追加した2行を削除した場合もエラーが出ますでしょうか?
HajimeHamada

2020/08/15 05:00

2行を削除した場合は、エラーはでません。出力を追記いたしました。
dameo

2020/08/16 08:23

横からすみませんが、mysqlのmigrateって失敗したら自力で元に戻さないといけないのでは?
HajimeHamada

2020/08/16 09:01

コメントありがとうございます。「自力」ということは、ALTER TABLEか何かで必要なカラムを自分で増やして、その後、migrateとかいうことでしょうか?
dameo

2020/08/16 09:06

逆です。 そのときにやろうとしたmigrateが途中で失敗したのですが、本来であればmigrate実行前の状態に戻さないといけないのに、djangoがそれをしないので、手作業でSQL叩いて戻さないといけないのではないかと… https://docs.djangoproject.com/ja/3.1/topics/migrations/#mysql 「MySQL はスキーマの変更操作周りのトランザクションをサポートしていません。つまり、マイグレーションの適用が失敗した場合には、手動で変更点を調べあげ、やり直さなければならないということです (過去の時点にロールバックすることは不可能ということです)。」
HajimeHamada

2020/08/16 09:25

「SQLを叩いて戻す」というところについて、詳しくお聞きしたいです。現状は多分、「reference.magazineというカラムは実際にはMySQL上にはないが、Djangoはあると勘違いしている」ということなのかなあ、と思っています。ということは、この「Djangoの勘違い」をSQLを使って自力で直す、ということになるのでしょうか? Djangoでmigrateを使っての開発が初めてなもので、へんなことを言っていたらすいません。
dameo

2020/08/16 09:29

マニュアルを読んで、不明点だけ聞いてください。あなたの思い込みを前提に話をしても私には分かりません。私の方でも具体的に言って頂かないと伝わってるのかどうかすら判断できません。
guest

回答1

0

自己解決

結局、問題になっていた2つのカラム追加をSQLを使って自分で追加し、

python3 manage.py makemigrations python3 manage.py migrate --fake

とすることで、DjangoのmigrationとMySQLのデータベースの整合を無理やりとる方法を取りました。最初に、makemigrationsが失敗した原因はわからず中途半端ですが、ひとまず解決としたいと思います。

コメントを下さった方々、ありがとうございました。

投稿2020/08/16 10:25

HajimeHamada

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問