2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ERROR 1067 (42000): Invalid default value for 'created_at'のHeroku環境での解消方法

Last updated at Posted at 2021-02-12

はじめに

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と大して変わりないもの(らしい)です。違いが知りたい人は是非調べて私に教えて欲しいものです。

手順

  1. Herokuにログイン
  2. 既存のClearDBアドオンを削除
  3. JawsDBアドオンを追加
  4. Herokuの環境変数(config)を変更
  5. 再度create.sqlなどを実行

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 アプリの名前

mysqlmysql2にすることや、末尾の?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先の関連ページも見ていただけますと幸いです。

それではまたどこかで。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?