20201114のMySQLに関する記事は4件です。

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 1

SQL?
いじった覚えがない。。結局リセットしたいわけだから、今回はそんなの関係ない!無視し、自分のリセット方法に誤りがあると仮説を立て、再度リセット方法を調べ直した。

行ったこと

データベースのリセットに関しては、以下のコマンドを実行することを知ったため、それで実行した。

% 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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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と接続

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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と接続

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベース検索の基本まとめ(SQL)

前書き

RDB環境: MySQL 5.6.50
GUIツール: Sequel Pro
テーブル: users, shifts(seedファイルで予め用意した情報を読み込み済)

users

カラム名 内容
family_name 苗字
first_name 名前
age 年齢
prefecture 出身地

検索方法

テーブルの全てのデータを検索する
クエリ
SELECT * FROM users

query_result

条件にあったデータを取得する
  • WHERE
    取得するレコードの条件を指定する。
クエリ
SELECT *
FROM users
WHERE family_name = "阿部"

query_result

  • LIKE
    文字列検索を可能にする。
    曖昧検索には%を使う。
クエリ
SELECT *
FROM users
WHERE prefecture LIKE '%都'

query_result

  • AND
    複数の条件を組み合わせる。
    全ての条件を満たせばtrueとなる。
クエリ
SELECT *
FROM users
WHERE prefecture LIKE '%都' AND age = 22

query_result

  • OR
    複数の条件のうちいずれかを満たせばtrueとなる。
クエリ
SELECT *
FROM users
WHERE age <= 20 OR prefecture = "東京都"

query_result

  • NOT
    条件に当てはまらないデータを取得する。
クエリ
SELECT *
FROM users
WHERE NOT prefecture = "東京都"

query_result

  • BETWEEN
    範囲指定した条件にあったデータを取得する。
クエリ
SELECT *
FROM users
WHERE age BETWEEN 21 AND 24

query_result

  • IN
    特定の条件が含まれるデータを取得する。
クエリ
SELECT *
FROM users
WHERE prefecture IN ("東京都", "神奈川県")

query_result

要点整理

  • WHEREとは、取得するデータを「条件」によって制限できる.
  • LIKEとは、文字列検索を行う際に使用できる句のこと。
  • AND演算子とは、複数の条件がすべて正しい場合に、正とすることができる演算子。
  • OR演算子とは、複数の条件のうち、1つ以上を満たしたデータを取得する演算子。
  • NOT演算子とは、条件が正しくない場合に正となり、言わば否定形の演算子。
  • BETWEEN演算子とは、上限と下限を設定し、その範囲に含まれる場合は正となる演算子。
  • IN演算子とは、1つのカラムに対しリストを指定して、カラムの値がそのリストに含まれるとき、その式は正になるという演算子。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む