はじめに
2つの環境でMySQLの構築をする際に表題のエラー
ERROR 1067 (42000): Invalid default value for 'created_at'
が出てきました。環境によって解決できるかどうか異なりますが、少なくともherokuでは解決できました。同じような問題に直面した人々の助けに少しでもなるように期待しつつ書いていきます。
結論
これだけ見てわかった人はちゃちゃっとそうしましょう。
ClearDBからJawsDBに変える
これだけです。
発端
このHerokuデプロイする(工事中)でデプロイをして、取得したアドオンであるDBのURLに
mysql -h ホスト名 -u ユーザ名 -p パスワード データベース名
で接続して、このRESTfulなAPIを作る(工事中)で作ったcreate.sqlを実行しようとしたら、表題のエラーがでてきました。
実際は、Herokuでデプロイする前にも無料レンタルサーバー【XFREE(エックスフリー)】でAPIつくれないかな〜と思い、そのサーバのMySQLで同じcreate.sqlを実行しようとしたところ、同じく表題のエラーが出てきました。
色々調べていくうちに、そもそもここを使わない方がAPI作りやすそうだとなり、ここではなくHerokuを使うことになりました。
そのためここの環境下でDBを変更できるかわかりません。わからないので、このエラーを解決できるかもわかりません。一つ言えることは、どの環境であれ使用データベースの変更が有効である可能性が高いということです。
原因(個人の見解)
ClearDBではMySQLのバージョンの5.7以上は有料で、無料のを使ったりしている人はバージョンが低いです。そのため、旧バージョンでは対応していないdefault値にエラーがでてしまいます。
JawsDB users can choose their database version at provision time by specifying a --version flag. Versions 5.7 and 8.0 are currently supported. If no version flag is supplied, the default database version will be used. The current default database version is 5.7
上記の通りJawsDBでは5.7以上のバージョンも無料なので、それを使うことでこのバグを解消します。JawsDB自体はClearDBと大して変わりないもの(らしい)です。違いが知りたい人は是非調べて私に教えて欲しいものです。
手順
Herokuにログイン
Herokuのウェブページで行っても良いですし、Heroku CLIを用いても構いません。
ウェブページでの方法は直感的にわかると思うので、今回はHeroku CLIを用いた方法を説明します。ウェブページで行う際は、いくつかの種類の中からMySQLを選択していることを確認してくださいね。
前提条件
Heloku CLIがインストールされている
heroku login
# heroku: Press any key to open up the browser to login or q to exit:
書いてある通り好きなキーを押します。
するとブラウザでページが立ち上がるので、(ログインしてない人はログインして)loginボタンを押します。
# Opening browser to https://cli-auth.heroku.com/auth/cli/browser/xxxxxx?requestor=SFMyNTY.g2gDbQAAAA4xMDYuNzIuMTMyLjIyNW4GAMuUppV3AWIAAVGA.02LuBEXq-5kx0VpyPPe-jJriqRbj4uLysvRbd0-PsJk
# Logging in... done
# Logged in as yourmail@example.com
以上のように表示され、無事ログインできたことがわかります。
既存のClearDBアドオンを削除
以下のようなコードを実行します。
heroku addons:remove cleardb:プランの名前 --app アプリの名前
無料のプランであるignitを使っている場合は以下のようになります。
heroku addons:remove cleardb:ignit --app アプリの名前
アプリの名前はheroku create アプリの名前
でアプリを作った時のものです
このエラーを解消したいアプリの、アプリの名前を使いましょう。
JawsDBアドオンを追加
以下のようなコードを実行します。
heroku addons:create jawsdb:プランの名前 --app アプリの名前
無料のプランであるkitefinを使いたい場合は以下のようになります。
heroku addons:create jawsdb:kitefin --app アプリの名前
これで追加されます。
Herokuの環境変数(config)を変更
以下のようなコードを実行して、URLを確認します。
heroku config --app アプリの名前 | grep JAWSDB_URL
# JAWSDB_URL: mysql://<username>:<password>@<hostname>:<port>/<db_name>
DATABASE_URLを変更し、このRESTfulなAPIを作るのような方法でDBに接続しているなら、DB_USERNAMEなどの変更も行います。ここでは、DATABASE_URLについてのみ記載します。
heroku config:heroku config:set DATABASE_URL='mysql2://<username>:<password>@<hostname>/<db_name>?reconnect=true' --app アプリの名前
mysql
をmysql2
にすることや、末尾の?reconnect=true' --app アプリの名前
を忘れないようにしてください。これで準備は完了です。
再度create.sqlなどを実行
以下のコマンドでDBに接続します。ホスト名などはheroku config ...
で得たURLのものです。
mysql -h ホスト名 -P ポート番号 -u ユーザ名 -p パスワード データベース名
接続できたら、create.sqlの場合は以下のようにして実行します。
sqlファイルを用いない場合など、適宜自分の環境に置き換えて実行したいSQL文を実行してください。
use データベース名
-- Database changed
\. create.sql
-- Query OK, ...
以上です。特に別のエラーがなければ、表題のエラーが出ることなく成功すると思います。
おわりに
最後までご覧いただきありがとうございました。RESTfulなAPIを作る過程で起きたこの出来事でしたが、無事解決できてよかったです。読者の方々も無事解決できていることを祈ります。
実は私はQiitaで書くのはまだ5回にも満たないひよっ子です。
読みにくいところなどございましたら、お気軽にコメントいただければと思います。
お時間があるようでしたらURL先の関連ページも見ていただけますと幸いです。
それではまたどこかで。
参考
- https://stackoverflow.com/questions/66069651/error-1067-42000-at-line-30-invalid-default-value-for-created-at
- https://qiita.com/nochifuchi/items/573e4630fd5722e41ae8
- https://subscription.packtpub.com/book/virtualization_and_cloud/9781782173458/3/ch03lvl1sec39/removing-the-add-on#:~:text=It's%20also%20possible%20to%20delete,and%20finally%20click%20on%20Save.
- https://qiita.com/reiya018/items/ba8ceaa732edac07e491
- https://qiita.com/yutaono/items/34bdc9383ce5870e7b8b