- 投稿日:2020-11-14T20:33:49+09:00
HerokuをリセットしようとしたらActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near が出た場合の対処法
リセットしようとした経緯
本番環境ではあるものの、たくさんのユーザーやデータを作りすぎ、見た目が繁雑になってきたため、Herokuのデータベースをリセットして初めからやり直したいと考えた。
背景
リセットをするために以下を実行した。
% heroku run rails db:reset (中略) rails aborted! ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database. If you are sure you want to continue, run the same command with the environment variable: DISABLE_DATABASE_ENVIRONMENT_CHECK=1
DISABLE_DATABASE_ENVIRONMENT_CHECK=1を付けて再度実行
% heroku run rails db:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails aborted! ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL, `updated_at` datetime(6) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=u' at line 1SQL?
いじった覚えがない。。結局リセットしたいわけだから、今回はそんなの関係ない!無視し、自分のリセット方法に誤りがあると仮説を立て、再度リセット方法を調べ直した。行ったこと
データベースのリセットに関しては、以下のコマンドを実行することを知ったため、それで実行した。
% heroku pg:reset DATABASE アプリ名 has no databases
消えた!と安心してデータベースを作成してみた、
% heroku run rails db:create (中略) Database 'heroku_データベース名' already exists
???
データベースが存在している?
ステータスをみてみた% heroku run rails db:migrate:status up up up ...(続く)
まだデータベースが残っていたことを確認し、再度データベース削除方法を調べ、以下のコマンドを実行した。
% heroku run RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop (中略) Dropped database 'heroku_データベース名'
正常にデータベースが削除されたことを確認し、以下のコマンドで、データベースを再度作り直した。
% heroku run rails db:create (中略) Created database 'heroku_データベース名'
新しいデータベースが作成されたことを確認した。ステータスを確認すると
% heroku run rails db:migrate:status (中略) Schema migrations table does not exist yet.
スキーママイグレーションテーブルがないと出たのでマイグレートを実行。
% heroku run rails db:migrate
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■この様に、マイグレート成功のログが流れたら、成功です。笑
思ったこと
直感的にheroku runコマンドの後に、テスト環境でterminalでいつも入力している様なrailsコマンド風に入力をしても、herokuは正しく動いてくれないんだなあと思いました。
今回herokuを使っていますが、Herokuを使う企業は日本だと少ないらしいので、今後はAWSに乗り換えるつもりです。
参考記事
https://qiita.com/quattro_4/items/a2eb3618207e21ca00d3
https://qiita.com/take18k_tech/items/7afdde59d387fbde5f7e
https://qiita.com/twipg/items/d8043cd4681a2780c160
- 投稿日:2020-11-14T19:52:16+09:00
MySQL操作でよく使うコマンド一覧
MySQLの操作で使用する事の多いコマンドを一覧形式でまとめます。
MySQLにログイン
mysql -u ユーザー名 -pを入力した後パスワードを入力。
パスワードはCLI上には表示されないので打ち間違いに注意。非推奨だが、-pの引数にパスワードを渡すと一発でログインもできる。
データベース一覧を表示
SHOW DATABASES;こんな感じで一覧が表示される。
mysql> SHOW databases; +--------------------+ | Database | +--------------------+ | information_schema | | myapp_development | | myapp_test | | mysql | | performance_schema | | root | | sys | +--------------------+ 7 rows in set (0.00 sec)※information_schemaとは?
※performance_schemaとはテーブル一覧を表示する
まずは使用するデータベースを選択します。
use データベース名; ex)use users;※コマンドの最後に「;」をつけ忘れないように注意。
データベースを選択したら、以下のコマンドを実行。SHOW TABLES;データベース内のテーブルを一覧で取得できます。
mysql> SHOW TABLES; +----------------------+ | Tables_in_myapp_test | +----------------------+ | posts | | schema_migrations | | users | +----------------------+ 3 rows in set (0.01 sec)※データベースを選択していない状態でも、
show tables from データベース名;で取得できる。
テーブル内のカラム一覧を取得する。
先ほどと同じくデータベースを選択。
以下のコマンドを実行。DESCRIBE テーブル名; show columns from テーブル名; ex)use users;こんな感じでテーブル内のカラム一覧を取得できる。
mysql> show columns from users; +-----------------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------------------+--------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | email | varchar(255) | NO | UNI | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | | name | varchar(255) | NO | | NULL | | | image | varchar(255) | YES | | NULL | | +-----------------------------+--------------+------+-----+---------+----------------+ 6 rows in set (0.01 sec)Docker環境でMySQLと接続
・docker-compose upでコンテナを立ち上げる。
・docker-compose exec db bash
・mysql -u ユーザー名 -pでDBコンテナに接続ECS/EC2コンテナからRDSに接続
・タスクを立ち上げ
・sshでEC2と接続
・docker exec -it コンテナID sh
・mysql -h エンドポイント -u ユーザー名 -pでRDSと接続
- 投稿日:2020-11-14T19:52:16+09:00
MySQL操作でよく使うコマンド
MySQLの操作における以下のコマンドをまとめます。
・MySQLにログイン
・データベース一覧を表示
・テーブル一覧を表示
・カラム一覧を表示MySQLにログイン
mysql -u ユーザー名 -pを入力した後パスワードを入力。
パスワードはCLI上には表示されないので打ち間違いに注意。非推奨だが、-pの引数にパスワードを渡すと一発でログインもできる。
データベース一覧を表示
SHOW DATABASES;こんな感じで一覧が表示される。
mysql> SHOW databases; +--------------------+ | Database | +--------------------+ | information_schema | | myapp_development | | myapp_test | | mysql | | performance_schema | | root | | sys | +--------------------+ 7 rows in set (0.00 sec)※information_schemaとは?
※performance_schemaとは
※sysとはテーブル一覧を表示する
まずは使用するデータベースを選択します。
use データベース名; ex)use users;※コマンドの最後に「;」をつけ忘れないように注意。
データベースを選択したら、以下のコマンドを実行。SHOW TABLES;データベース内のテーブルを一覧で取得できます。
mysql> SHOW TABLES; +----------------------+ | Tables_in_myapp_test | +----------------------+ | posts | | schema_migrations | | users | +----------------------+ 3 rows in set (0.01 sec)※データベースを選択していない状態でも、
show tables from データベース名;で取得できる。
テーブル内のカラム一覧を取得する。
先ほどと同じくデータベースを選択。
以下のコマンドを実行。DESCRIBE テーブル名; show columns from テーブル名; ex)show columns from users;こんな感じでテーブル内のカラム一覧を取得できる。
mysql> show columns from users; +-----------------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------------------+--------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | email | varchar(255) | NO | UNI | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | | name | varchar(255) | NO | | NULL | | | image | varchar(255) | YES | | NULL | | +-----------------------------+--------------+------+-----+---------+----------------+ 6 rows in set (0.01 sec)Docker環境でMySQLと接続
・docker-compose upでコンテナを立ち上げる。
・docker-compose exec db bash
・mysql -u ユーザー名 -pでDBコンテナに接続ECS/EC2コンテナからRDSに接続
・タスクを立ち上げ
・sshでEC2と接続
・docker exec -it コンテナID sh
・mysql -h エンドポイント -u ユーザー名 -pでRDSと接続
- 投稿日:2020-11-14T15:03:19+09:00
データベース検索の基本まとめ(SQL)
前書き
RDB環境: MySQL 5.6.50
GUIツール: Sequel Pro
テーブル: users, shifts(seedファイルで予め用意した情報を読み込み済)users
カラム名 内容 family_name 苗字 first_name 名前 age 年齢 prefecture 出身地 検索方法
テーブルの全てのデータを検索する
クエリSELECT * FROM users条件にあったデータを取得する
- WHERE
取得するレコードの条件を指定する。クエリSELECT * FROM users WHERE family_name = "阿部"
- LIKE
文字列検索を可能にする。
曖昧検索には%を使う。クエリSELECT * FROM users WHERE prefecture LIKE '%都'
- AND
複数の条件を組み合わせる。
全ての条件を満たせばtrueとなる。クエリSELECT * FROM users WHERE prefecture LIKE '%都' AND age = 22
- OR
複数の条件のうちいずれかを満たせばtrueとなる。
クエリSELECT * FROM users WHERE age <= 20 OR prefecture = "東京都"
- NOT
条件に当てはまらないデータを取得する。クエリSELECT * FROM users WHERE NOT prefecture = "東京都"
- BETWEEN
範囲指定した条件にあったデータを取得する。クエリSELECT * FROM users WHERE age BETWEEN 21 AND 24
- IN
特定の条件が含まれるデータを取得する。クエリSELECT * FROM users WHERE prefecture IN ("東京都", "神奈川県")要点整理
- WHEREとは、取得するデータを「条件」によって制限できる.
- LIKEとは、文字列検索を行う際に使用できる句のこと。
- AND演算子とは、複数の条件がすべて正しい場合に、正とすることができる演算子。
- OR演算子とは、複数の条件のうち、1つ以上を満たしたデータを取得する演算子。
- NOT演算子とは、条件が正しくない場合に正となり、言わば否定形の演算子。
- BETWEEN演算子とは、上限と下限を設定し、その範囲に含まれる場合は正となる演算子。
- IN演算子とは、1つのカラムに対しリストを指定して、カラムの値がそのリストに含まれるとき、その式は正になるという演算子。