20200705のMySQLに関する記事は6件です。

Ubuntu (Raspberry pi) のMySQLサーバー立ち上げ〜リモート接続

1. Raspberry PiにMySQLをインストールする。

下記コマンドでインストール

$ sudo apt update
$ sudo apt -y install mysql-server mysql-client

2. MySQLにアクセス

成功すれば以下のように表示される

$ sudo mysql

#下記が表示される
mysql> 

# 実行してみる
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

# 終了方法
mysql> quit

3. IP制限の解除

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

# 以下mysqld.cnf内

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#コメントアウトする↓
# bind-address          = 127.0.0.1

設定を反映する

$ sudo systemctl restart mysql

4. リモート接続元(自分の場合はMac)のアクセス権登録

接続元の[ホスト名@"IPアドレス"]を調べておく。
(ホスト名:MacbookAirとかそんな名前になっていた。Raspberrypiの場合は[raspberrypi]だった)
パスワードはお好きな物を。Query OKとなれば問題なし。

# 以下コマンドでは全てのデータベースをアクセス対象とする場合
# grant '権限の種類' on 'データベース' to '接続元' identified by 'パスワード'
mysql> grant all privileges on *.* to MacbookAir@"XXX.XXX.XXX.XXX" identified by 'password';
Query OK, 0 rows affected, 1 warning (0.00 sec)

5. リモート接続元からのアクセス

前提として、MySQLがインストールされている状態。なければインストールしてください。
自分の場合はRaspberry piのホスト名がubuntuでした。

# mysql -u '接続元ホスト名' -h '接続先ホスト名' -p
$ mysql -u Macbook -h ubuntu -p

# 以下が表示されれば接続完了
mysql> 

なお、Raspberry piが接続元の場合はMysqlをインストール使用とすると以下が表示される。

$ sudo apt-get install mysql-server
-------------------------------------------------------------------
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
パッケージ mysql-server は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。
しかし、以下のパッケージが置き換えます:
  mariadb-server-10.0

E: パッケージ 'mysql-server' にはインストール候補がありません

その為、代わりにMariaDBをインストールし、接続する。

$ sudo apt-get install mariadb-server
~
# 5と同様にして、予め設定していたホスト名とパスワードで接続できる
$ mysql -u '接続元ホスト名' -h '接続先ホスト名' -p

特に難しい訳ではないが、忘れてしまった時に調べ直すのが面倒なので忘備録として。

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

MySQL の DATETIME 型と TIMESTAMP 型を範囲検索するサンプル SQL 文

概要

  • MySQL の DATETIME 型と TIMESTAMP 型を範囲検索するサンプル SQL 文を示す
  • 今回の環境: macOS Catalina + MySQL 8.0.19 (Homebrew でインストールしたもの)

MySQL の DATETIME 型と TIMESTAMP 型

DATETIME 型

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.1 DATE、DATETIME、および TIMESTAMP 型

DATETIME 型は、日付と時間の両方の部分を含む値に使用されます。MySQL では、DATETIME 値の取得と表示は 'YYYY-MM-DD HH:MM:SS' 形式で行われます。サポートしている範囲は '1000-01-01 00:00:00' から '9999-12-31 23:59:59' です。

TIMESTAMP 型

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.1 DATE、DATETIME、および TIMESTAMP 型

TIMESTAMP データ型は、日付と時間の両方の部分を含む値に使用されます。TIMESTAMP には、'1970-01-01 00:00:01' UTC から '2038-01-19 03:14:07' UTC の範囲があります。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.1 DATE、DATETIME、および TIMESTAMP 型

MySQL は、TIMESTAMP 値を、ストレージでは現在のタイムゾーンを UTC に変換し、取得では UTC から現在のタイムゾーンに戻します。(DATETIME などのほかの型ではこれは行われません。)デフォルトでは、接続ごとの現在のタイムゾーンはサーバーの時間です。

DATETIME 型と TIMESTAMP 型はマイクロ秒までの精度で小数秒部分を持つことが可能

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.1 DATE、DATETIME、および TIMESTAMP 型

DATETIME または TIMESTAMP 値には、マイクロ秒 (6 桁) までの精度で後続の小数秒部分を含めることができます。特に、MySQL 5.6.4 以降では、DATETIME または TIMESTAMP カラムに挿入された値の小数部はすべて破棄されずに格納されます。小数部が含まれる場合、これらの値の形式は 'YYYY-MM-DD HH:MM:SS[.fraction]' であり、DATETIME 値の範囲は '1000-01-01 00:00:00.000000' から '9999-12-31 23:59:59.999999' であり、TIMESTAMP 値の範囲は '1970-01-01 00:00:01.000000' から '2038-01-19 03:14:07.999999' です。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.6 時間値での小数秒

小数秒部を含むカラムを定義するには、type_name(fsp) の構文を使用します。ここで、type_name は TIME、DATETIME、または TIMESTAMP であり、fsp は小数秒の精度です。

例: CREATE TABLE t1 (t TIME(3), dt DATETIME(6));

fsp 値を指定する場合、0 から 6 の範囲にする必要があります。0 の値は、小数部がないことを表します。省略した場合、デフォルトの精度は 0 です。(これは、以前の MySQL バージョンと互換性を保つため、標準 SQL のデフォルトである 6 とは異なっています。)

BETWEEN での範囲検索は指定した値を含む結果が返る

MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.3.2 比較関数と演算子

expr BETWEEN min AND max

expr が min より多いか等しく、expr が max より少ないか等しい場合、BETWEEN は 1 を返し、それ以外では 0 を返します。すべての引数の型が同じであれば、これは式 (min <= expr AND expr <= max) と同等です。

マイクロ秒精度の DATETIME 型で秒までしか指定しない場合は小数秒部分が0になる

cast 関数で確認することができる。
以下の例では 2020-04-01 23:59:59 が 2020-04-01 23:59:59.000000 に変換されている。

mysql> select cast('2020-04-01 23:59:59' as datetime(6));
+--------------------------------------------+
| cast('2020-04-01 23:59:59' as datetime(6)) |
+--------------------------------------------+
| 2020-04-01 23:59:59.000000                 |
+--------------------------------------------+
1 row in set (0.00 sec)

MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.10 キャスト関数と演算子

CAST(expr AS type)

CONVERT() と同様に、CAST() 関数には任意の型の式が指定され、指定された型の結果値が生成されます。

範囲検索するサンプル

DATETIME 型を範囲検索するサンプル

検索対象となるテーブルを作成し検索用データを追加する。

mysql> create table t1 (id int not null auto_increment, dt datetime, primary key (id));
Query OK, 0 rows affected (0.06 sec)

mysql> show columns from t1;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int      | NO   | PRI | NULL    | auto_increment |
| dt    | datetime | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

mysql> insert into t1 (dt) values
    ->   (NULL),
    ->   ('0000-00-00 00:00:00'),
    ->   ('2020-04-01 00:00:00'),
    ->   ('2020-04-01 23:59:59'),
    ->   ('2020-04-02 00:00:00');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+----+---------------------+
| id | dt                  |
+----+---------------------+
|  1 | NULL                |
|  2 | 0000-00-00 00:00:00 |
|  3 | 2020-04-01 00:00:00 |
|  4 | 2020-04-01 23:59:59 |
|  5 | 2020-04-02 00:00:00 |
+----+---------------------+
5 rows in set (0.00 sec)

2020-04-01 のデータだけ検索したい。

between 演算子で検索する。

mysql> select * from t1 where dt between '2020-04-01 00:00:00' and '2020-04-01 23:59:59';
+----+---------------------+
| id | dt                  |
+----+---------------------+
|  3 | 2020-04-01 00:00:00 |
|  4 | 2020-04-01 23:59:59 |
+----+---------------------+
2 rows in set (0.02 sec)

小なりイコール演算子 (Less than or equal operator) で検索する。

mysql> select * from t1 where '2020-04-01 00:00:00' <= dt and dt <= '2020-04-01 23:59:59';
+----+---------------------+
| id | dt                  |
+----+---------------------+
|  3 | 2020-04-01 00:00:00 |
|  4 | 2020-04-01 23:59:59 |
+----+---------------------+
2 rows in set (0.00 sec)

小なりイコール演算子 (Less than or equal operator)と、小なり演算子 (Less than operator) で検索する。

mysql> select * from t1 where '2020-04-01 00:00:00' <= dt and dt < '2020-04-02 00:00:00';
+----+---------------------+
| id | dt                  |
+----+---------------------+
|  3 | 2020-04-01 00:00:00 |
|  4 | 2020-04-01 23:59:59 |
+----+---------------------+
2 rows in set (0.02 sec)

DATETIME 型 (小数秒部分あり) を範囲検索するサンプル

検索対象となるテーブルを作成し検索用データを追加する。
マイクロ秒までの精度に対応するため、DATETIME 型の小数秒の精度に 6 を指定する。

mysql> create table t2 (id int not null auto_increment, dt datetime(6), primary key (id));
Query OK, 0 rows affected (0.02 sec)

mysql> show columns from t2;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| dt    | datetime(6) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

mysql> insert into t2 (dt) values
    ->   (NULL),
    ->   ('0000-00-00 00:00:00.000000'),
    ->   ('2020-04-01 00:00:00.000000'),
    ->   ('2020-04-01 23:59:59.000000'),
    ->   ('2020-04-01 23:59:59.999999'),
    ->   ('2020-04-02 00:00:00.000000');
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from t2;
+----+----------------------------+
| id | dt                         |
+----+----------------------------+
|  1 | NULL                       |
|  2 | 0000-00-00 00:00:00.000000 |
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
|  5 | 2020-04-01 23:59:59.999999 |
|  6 | 2020-04-02 00:00:00.000000 |
+----+----------------------------+
6 rows in set (0.00 sec)

2020-04-01 のデータだけ検索したい。

between 演算子で秒まで指定して検索すると、小数秒部分を取りこぼしてしまう。

mysql> select * from t2 where dt between '2020-04-01 00:00:00' and '2020-04-01 23:59:59';
+----+----------------------------+
| id | dt                         |
+----+----------------------------+
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
+----+----------------------------+
2 rows in set (0.00 sec)

between 演算子で小数秒まで指定して検索すれば小数秒部分を取りこぼさない。
ただし、データの精度を把握していないと指定する値を決めるのが難しい。

mysql> select * from t2 where dt between '2020-04-01 00:00:00' and '2020-04-01 23:59:59.999999';
+----+----------------------------+
| id | dt                         |
+----+----------------------------+
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
|  5 | 2020-04-01 23:59:59.999999 |
+----+----------------------------+
3 rows in set (0.00 sec)

小なりイコール演算子 (Less than or equal operator)と、小なり演算子 (Less than operator) で検索する。

mysql> select * from t2 where '2020-04-01 00:00:00' <= dt and dt < '2020-04-02 00:00:00';
+----+----------------------------+
| id | dt                         |
+----+----------------------------+
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
|  5 | 2020-04-01 23:59:59.999999 |
+----+----------------------------+
3 rows in set (0.00 sec)

DATETIME 型のカラムの値を DATE 型にキャストして日付のみで一致するものを検索する。

mysql> select * from t2 where cast(dt as date) = '2020-04-01';
+----+----------------------------+
| id | dt                         |
+----+----------------------------+
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
|  5 | 2020-04-01 23:59:59.999999 |
+----+----------------------------+
3 rows in set (0.00 sec)

between 演算子で大きめの範囲を指定して検索し、除外したい値を不等価演算子 (Not equal operator) で除外する。

mysql> select * from t2 where dt between '2020-04-01 00:00:00' and '2020-04-02 00:00:00' and dt != '2020-04-02 00:00:00';
+----+----------------------------+
| id | dt                         |
+----+----------------------------+
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
|  5 | 2020-04-01 23:59:59.999999 |
+----+----------------------------+
3 rows in set (0.00 sec)

TIMESTAMP 型を範囲検索するサンプル

検索対象となるテーブルを作成し検索用データを追加する。

mysql> create table t3 (id int not null auto_increment, ts timestamp, primary key (id));
Query OK, 0 rows affected (0.02 sec)

mysql> show columns from t3;
+-------+-----------+------+-----+---------+----------------+
| Field | Type      | Null | Key | Default | Extra          |
+-------+-----------+------+-----+---------+----------------+
| id    | int       | NO   | PRI | NULL    | auto_increment |
| ts    | timestamp | YES  |     | NULL    |                |
+-------+-----------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

mysql> insert into t3 (ts) values
    ->   (NULL),
    ->   ('0000-00-00 00:00:00'),
    ->   ('2020-04-01 00:00:00'),
    ->   ('2020-04-01 23:59:59'),
    ->   ('2020-04-02 00:00:00');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> 
mysql> select * from t3;
+----+---------------------+
| id | ts                  |
+----+---------------------+
|  1 | NULL                |
|  2 | 0000-00-00 00:00:00 |
|  3 | 2020-04-01 00:00:00 |
|  4 | 2020-04-01 23:59:59 |
|  5 | 2020-04-02 00:00:00 |
+----+---------------------+
5 rows in set (0.00 sec)

2020-04-01 のデータだけ検索したい。

between 演算子で検索する。

mysql> select * from t3 where ts between '2020-04-01 00:00:00' and '2020-04-01 23:59:59';
+----+---------------------+
| id | ts                  |
+----+---------------------+
|  3 | 2020-04-01 00:00:00 |
|  4 | 2020-04-01 23:59:59 |
+----+---------------------+
2 rows in set (0.00 sec)

小なりイコール演算子 (Less than or equal operator) で検索する。

mysql> select * from t3 where '2020-04-01 00:00:00' <= ts and ts <= '2020-04-01 23:59:59';
+----+---------------------+
| id | ts                  |
+----+---------------------+
|  3 | 2020-04-01 00:00:00 |
|  4 | 2020-04-01 23:59:59 |
+----+---------------------+
2 rows in set (0.00 sec)

小なりイコール演算子 (Less than or equal operator)と、小なり演算子 (Less than operator) で検索する。

mysql> select * from t3 where '2020-04-01 00:00:00' <= ts and ts < '2020-04-02 00:00:00';
+----+---------------------+
| id | ts                  |
+----+---------------------+
|  3 | 2020-04-01 00:00:00 |
|  4 | 2020-04-01 23:59:59 |
+----+---------------------+
2 rows in set (0.00 sec)

TIMESTAMP 型 (小数秒部分あり) を範囲検索するサンプル

検索対象となるテーブルを作成し検索用データを追加する。
マイクロ秒までの精度に対応するため、TIMESTAMP 型の小数秒の精度に 6 を指定する。

mysql> create table t4 (id int not null auto_increment, ts timestamp(6), primary key (id));
Query OK, 0 rows affected (0.01 sec)

mysql> show columns from t4;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| ts    | timestamp(6) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

mysql> insert into t4 (ts) values
    ->   (NULL),
    ->   ('0000-00-00 00:00:00.000000'),
    ->   ('2020-04-01 00:00:00.000000'),
    ->   ('2020-04-01 23:59:59.000000'),
    ->   ('2020-04-01 23:59:59.999999'),
    ->   ('2020-04-02 00:00:00.000000');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from t4;
+----+----------------------------+
| id | ts                         |
+----+----------------------------+
|  1 | NULL                       |
|  2 | 0000-00-00 00:00:00.000000 |
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
|  5 | 2020-04-01 23:59:59.999999 |
|  6 | 2020-04-02 00:00:00.000000 |
+----+----------------------------+
6 rows in set (0.00 sec)

2020-04-01 のデータだけ検索したい。

between 演算子で秒まで指定して検索すると、小数秒部分を取りこぼしてしまう。

mysql> select * from t4 where ts between '2020-04-01 00:00:00' and '2020-04-01 23:59:59';
+----+----------------------------+
| id | ts                         |
+----+----------------------------+
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
+----+----------------------------+
2 rows in set (0.00 sec)

between 演算子で小数秒まで指定して検索すれば小数秒部分を取りこぼさない。
ただし、データの精度を把握していないと指定する値を決めるのが難しい。

mysql> select * from t4 where ts between '2020-04-01 00:00:00' and '2020-04-01 23:59:59.999999';
+----+----------------------------+
| id | ts                         |
+----+----------------------------+
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
|  5 | 2020-04-01 23:59:59.999999 |
+----+----------------------------+
3 rows in set (0.00 sec)

小なりイコール演算子 (Less than or equal operator)と、小なり演算子 (Less than operator) で検索する。

mysql> select * from t4 where '2020-04-01 00:00:00' <= ts and ts < '2020-04-02 00:00:00';
+----+----------------------------+
| id | ts                         |
+----+----------------------------+
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
|  5 | 2020-04-01 23:59:59.999999 |
+----+----------------------------+
3 rows in set (0.00 sec)

TIMESTAMP 型のカラムの値を DATE 型にキャストして日付のみで一致するものを検索する。

mysql> select * from t4 where cast(ts as date) = '2020-04-01';
+----+----------------------------+
| id | ts                         |
+----+----------------------------+
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
|  5 | 2020-04-01 23:59:59.999999 |
+----+----------------------------+
3 rows in set (0.00 sec)

between 演算子で大きめの範囲を指定して検索し、除外したい値を不等価演算子 (Not equal operator) で除外する。

mysql> select * from t4 where ts between '2020-04-01 00:00:00' and '2020-04-02 00:00:00' and ts != '2020-04-02 00:00:00';
+----+----------------------------+
| id | ts                         |
+----+----------------------------+
|  3 | 2020-04-01 00:00:00.000000 |
|  4 | 2020-04-01 23:59:59.000000 |
|  5 | 2020-04-01 23:59:59.999999 |
+----+----------------------------+
3 rows in set (0.00 sec)

参考資料

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

Create Pagination in PHP 7 with MySQL and Bootstrap

This tutorial explains how to create pagination in PHP 7 and MySQL using the Bootstrap 4 Pagination UI component. Also, learn how to set the dynamic limit in pagination with the session, create prev, next feature, active class in pagination to display results fetched from MySQL database.

click here to read more:
https://www.positronx.io/create-pagination-in-php-with-mysql-and-bootstrap/

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

MySQLのインデックス構造

通常MySQLのインデックスはB+木と呼ばれる構造に格納される。

インデックスには、クラスタインデックスと呼ばれる特別なものと、それ以外のセカンダリインデックスがある。

クラスタインデックスはMySQLのデータ構造そのもので、リーフノードにはテーブルの実データが格納される。
セカンダリインデックスはリーフノードにクラスタインデックスを参照するためのキーが格納される。

https://dev.mysql.com/doc/refman/5.6/ja/innodb-index-types.html

B+木

2分探索木の1種で、ルートノードから、データが格納されるリーフノードまでの距離が等しくなる。
リーフノード内のデータはキーで整列しており、リーフノード同士もリンクで連結されている。

b+tree.png

クラスタインデックス

テーブルに必ず一つ作成される。リーフノードにはテーブルの実データが格納される。

通常 Primary key がクラスタインデックスになる。Primary key がテーブルに作成されない場合、Unique key (全てのカラムがNOT NULLである必要がある), それも無い場合は非表示の行IDを格納するカラムの値を使ってクラスタインデックスが作成される。

mysql-cruster-index (1).png

末端のノード (リーフノード) はページと呼ばれ、既定で16KBの固定長サイズの領域で、テーブルの実データが格納される。

https://dev.mysql.com/doc/refman/5.6/ja/innodb-file-space.html

セカンダリインデックス

クラスタインデックス以外の通常のインデックス。

セカンダリインデックスは任意のカラムを使って構築出来る。クラスタインデックスと同様にB+木の構造に格納されるが、指定された任意のカラムの値を使ってツリー構造が作成される。
また、セカンダリインデックスのリーフノードには、クラスタインデックスを検索するためのキー (通常はPK) が格納される。

mysql-secondary-index (1) (1).png

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

Node-REDでのSQLインジェクション対策

概要

Node-REDを簡易REST APIサーバーとして使う案件があって、
DBサーバー(MySQL)にログを保存する仕掛けになっているんだけど、
SQLインジェクション対策ってどうやるんだっけと思って、調べてみた話。

結果

node-red-contrib-sqlstringというノードがあって、これが使えそう。
ただ、Exampleが不足していて、ちょっと使い方がわかり辛かった・・・。

使い方

  1. node-red-contrib-sqlstringを追加。
    ハンバーガーメニューから、パレットの管理を選択
    image.png
    ノードを追加タブを選び、検索文字に「sqlstring」を入れると、node-red-contrib-sqlstringが表示されるので、「ノードを追加」をクリック
    image.png
    追加が完了すると、パレットにnode-red-contrib-sqlstringのノードが追加されています(なぜかストレージの項目・・・)。
    image.png

  2. フローを作成
    フローはざっくりこんな感じにしてみます。
    image.png

  3. node-red-contrib-sqlstringの設定
    ノードをダブルクリックして、設定を行います。
    SQL構文をそのまま書けるのが嬉しい!(このノードを知るまで、Functionノードでごにょごにょ書いてた・・・)
    変数は構文の中に「?」を書いておき、Variables欄に該当する変数をカンマ区切りで記載します。
    image.png

ここでハマったのが、変数の指定の仕方。
http inノードで受けたデータは、msg.payloadの中に入ってくるんですが、
例えばブラウザで「localhost:1880/test/api/hoge?id=1」と指定すると
msg.payload.idに1が設定されて次のノードにわたってきます。

ここで、Variables欄に「msg.payload.id」と指定しても、上手く値が入ってこない・・・。
試しに「id」としても、上手く値が入ってこない・・・。
node-red-contrib-sqlstringのソース見たら、
どうやらこの場合は「payload.id」と指定する必要があるようです。
⇒ Node-REDではこの指定の方法が普通なのかな?

ちなみに、このノード、SQLインジェクション対策は
https://github.com/mysqljs/sqlstringを利用しているとのこと。

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

既存のrails6のアプリにMySQLでDockerを導入する。

初心者ですが既存のrails6のアプリにMySQLでDockerを導入できたので備忘録として記事を残します。
もし間違っていたら教えていただきたいです。

Ruby on Rails 「途中まで作ったアプリにDockerを導入したい」に挑戦してみる(MySQL / Sequel Pro)

基本的にはこちらの方の記事を参考にさせていただきました。

1 Dockerfile/docker-compose.ymlを既存アプリのルートディレクトリに作成する。

2 Dockerfileを編集する

Dockerfile
FROM ruby:2.6

RUN apt-get update -qq && \
    apt-get install -y build-essential \ 
                       libpq-dev \        
                       nodejs      

RUN mkdir /app_name 

ENV APP_ROOT /app_name 
WORKDIR $APP_ROOT

ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

RUN gem install bundler 
RUN bundle install
ADD . $APP_ROOT

FROM ruby:2.6 について

私のアプリはruby2.6.2で作られているので、このように記述しました。

3 docker-compose.ymlを編集する

docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - "4306:3306"

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app_name
    ports:
      - "3000:3000"
    depends_on:
      - db

基本的には参考記事通りです。

4 database.yml編集する。

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  socket: /tmp/mysql.sock
  host: db
  # host: localhost これは以前までのもので一応コメントアウトで残しておきました。

development:
  <<: *default
  database: 自分のDBの名前

5 docker-compose build でコンテナを作成する。

[自分のアプリ名] $ docker-compose build 
これで新たにDockerのコンテナが作成されます。

一番最初だけ時間がかかるので気長に待ちましょう。

6 Dockerコンテナ上でDB作成&migrationを実行

rails6の場合ここで以下のようなエラーが出ると思います。
ySQL Community Server (GPL)
web_1  | => Booting Puma
web_1  | => Rails 6.0.3.1 application starting in development 
web_1  | => Run `rails server --help` for more startup options
web_1  | sh: 1: yarn: not found
web_1  | 
web_1  | 
web_1  | ========================================
web_1  |   Your Yarn packages are out of date!
web_1  |   Please run `yarn install --check-files` to update.
web_1  | ========================================
web_1  | 
web_1  | 
web_1  | To disable this check, please change `check_yarn_integrity`
web_1  | to `false` in your webpacker config file (config/webpacker.yml).
web_1  | 
web_1  | 
web_1  | 
web_1  | 
web_1  | 
web_1  | Exiting

このエラーを解消したいのでエラー文通りに

config/webpacker.yml
  # Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
  check_yarn_integrity: false
このようにfalseに変えることでエラーを解消できました。

参考記事
yarnが原因でdocker-compose up ができない ( Your Yarn packages are out of date!)」に挑戦してみる(MySQL / Sequel Pro)

本題に戻ります

[自分のアプリ名] $ docker-compose run web bundle exec rake db:create

このコマンドでDocker上にDBが作成されます。
レコードは最初からになるので注意してください。

[自分のアプリ名] $ docker-compose run web bundle exec rake db:migrate

migrateも忘れずに行いましょう。

7 docker-compose up でコンテナを起動する。

[自分のアプリ名] $ docker-compose up

これでローカルホストで表示できるようになりました。
コンテナが立ち上がったら
http://localhost:3000/
にアクセスしてみてください。

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