20190126のMySQLに関する記事は9件です。

mysqlの操作方法についての基本まとめ

mysqlに入る

rootユーザーで入る

mysql -u root

rootユーザー以外で入る

mysql -u ユーザー名 -p データベース名

データベースの中身をを表示したりするやつ

操作内容 コマンド
データベース一覧を表示 show databases;
ユーザーの一覧を表示 select Host, User, Password from mysql.user;
操作するデータベースを変更 use データベース名;
現在操作しているデータベースを確認 select database();
データベースのテーブル一覧を表示 show tables;
あるテーブルのテーブル構造を表示 desc テーブル名
あるテーブルのレコード一覧を表示 select * from テーブル名;

ひらがなで書かれてる所は都度都度で変えてください。

データベース作成とかカラム追加とか

--データベースの作成
create database データベース名;

--データベースの削除
drop database データベース名;

--テーブルを作成する
create table テーブル名 (
  カラム名 データ型 オプション,
  カラム名 データ型 オプション,
  カラム名 データ型 オプション
);

--テーブルの削除
drop table テーブル名;

--テーブル名の変更
alter table 変更前のテーブル名 rename 変更後のテーブル名;

--カラムの追加
alter table テーブル名 add column カラム名 データ型 オプション;

--カラムの削除
alter table テーブル名 drop column カラム名;

--データ型変更
alter table テーブル名 change カラム名 新しいカラム名 新しいデータ型;

--インデックスの追加
alter table テーブル名 add index インデックス名([カラム名1, カラム名2, ...]);

カラム追加のオプション

オプション コマンド
主キー primary key auto_increment
null不可 not null
デフォルト値設定 default デフォルトの値
ユニーク設定 unique
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLユーザ作成について

私は今までPHP学習にMySQLを使ってきていましたが、ユーザや権限周りをあまり触ってきませんでした。
DB操作は全てroot権限で行なっていました。ユーザ作成や権限周りに触れる機会があったので、自分用にまとめてみようと思います。

DBにアクセス

$ mysql -u root -p

MySQLユーザー作成

ユーザの確認

MySQLのユーザ一覧を確認。

SELET  host, user FROM mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
4 rows in set (0.00 sec)

ユーザの作成

--ユーザ作成
CREATE USER 'user_name'@'localhost';

--MySQL 5.7以前パスワード設定 / 変更
SET PASSWORD FOR 'user_name'@'localhost' IDENTIFIED BY 'user_password';

--MySQL 8.0 以降パスワード設定 / 変更
ULTER USER 'user_name'@'localhost' IDENTIFIED BY 'user_password';

--ユーザ作成&パスワード設定 バージョン共通
CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'your_password;

試しにやってみる。

CREATE USER 'test'@'localhost' IDENTIFIED BY 'test';

SELECT  host, user FROM mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
| localhost | test             |
+-----------+------------------+
5 rows in set (0.00 sec)

ユーザ削除

DROP USER test;

ユーザの権限設定

権限の確認

mysql> SHOW GRANTS FOR 'test'@'localhost';
+------------------------------------------+
| Grants for user@localhost                |
+------------------------------------------+
| GRANT USAGE ON *.* TO `user`@`localhost` |
+------------------------------------------+

権限の追加

概要などは下記URLが詳しいので参考になりました。

[MySQL]権限の確認と付与

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

MySQLの文字コードを変更する方法

ProgateでRuby on Railsレッスンで、tweetappというものを作成したので、そのコピーをDockerとGithubを使いながら、開発をしています。

ちなみにRails環境は以下のページを参考に構築しました。
https://qiita.com/reflet/items/f73cac406760ee4ecc13
感謝です(^^)

しかし、新規投稿機能のところで、日本語の文字列をDBに保存できない問題に直面。

エラー文は全文は控えてなかったのですが以下のような感じで、文字コードが原因っぽい。

Mysql2::Error: Incorrect string value ,,,,,,

いろいろネットで調べて以下の方法で解決したので、メモです。

MySQLのクライアントサーバーとMySQLサーバーの文字コードの確認・変更

#確認したいテーブルを選択
mysql> use DB名

#文字コードを確認
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | latin1                     |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

#以下のコマンドでUTF-8に変更
mysql> set character_set_client = utf8
mysql> set character_set_connection = utf8
mysql> set character_set_database = utf8
mysql> set character_set_results = utf8

「character_set_server」「character_set_system」は「docker-compose.yml」のMySQLにcommandを以下のように追加したらUTF-8に変更できました。

command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci

既に作成したDBの文字コードの確認・変更

#確認
mysql> show create database DB名;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| example  | CREATE DATABASE `example` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+

#変更
mysql> alter database DB名 character set utf8;

既に作成したMySQLのテーブルカラムの確認・変更

#確認
mysql> show create table テーブル名 \G;
*************************** 1. row ***************************
       Table: posts
Create Table: CREATE TABLE `posts` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `content` text CHARACTER SET latin1,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

#変更
mysql> alter table テーブル名 modify カラム名 varchar(255) character set utf8;

この時点で日本語に保存できました。

いやーハマっちゃいましたw
これから、カラムを追加したり、新しいテーブルを作成するので、どうなるのでしょうか。

とりあえず進めていきます。

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

MysqlでScalikeJDBC入門2 (テスト編)

目的

mysqlでscalikeJDBCのコード自動生成を行い、テストまで通します。

解説したコード全体はこちら: umeneri/scalikejdbc-example: example for scalikejdbc

テスト用DBの設定

前回からの続きです。

まず、テスト用DBのexample_testを作ります。

以下でログインして、

$ mysql -h 127.0.0.1 -uroot -P 4306

DBを作ります。

> create database example_test;

memberテーブルも作成しておきます。

> use example_test;

> CREATE TABLE member
(
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(256) NOT NULL,
  description VARCHAR(1000),
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL,
  PRIMARY KEY (id)
) ENGINE = 'InnoDB', DEFAULT CHARSET=utf8mb4, ROW_FORMAT=DYNAMIC;

application.confにテスト用DB設定を追加します。
ここではtestという名前のコネクション設定を新たに作っています。 example_testにアクセスします。

src/test/resources/test.conf
db.test.driver="com.mysql.jdbc.Driver"
db.test.url="jdbc:mysql://127.0.0.1:4306/example_test"
db.test.user="root"
db.test.password=""

テストコードの修正

class MemberSpecの行の下に以下を設定し、jdbcでテスト用DBへアクセスできるようにします。

src/test/scala/models/MemberSpec.scala
class MemberSpec extends fixture.FlatSpec with Matchers with AutoRollback {
  config.DBs.setup('test)

  override def db = NamedDB('test).toDB
  ...

更に次の行に下記を追加します。
fixtureを定義することで、テスト用DBへ予めテストデータをinsertしておけますので、findのテストを失敗させずにすみます。

src/test/scala/models/MemberSpec.scala
  override def fixture(implicit session: DBSession) {
    sql"insert into member values (1, ${"Alice"}, '', current_timestamp, current_timestamp)".update.apply()
    sql"insert into member values (2, ${"Bob"},  '', current_timestamp, current_timestamp)".update.apply()
  }

create, updateのテストコード修正

そのままだとcreate new recordのテストが失敗します。created_atがnullになっているのが原因なので、修正します。

差分です。

-    val created = Member.create(name = "MyString", createdAt = null, updatedAt = null)
+    val created = Member.create(name = "MyString", createdAt = ZonedDateTime.now(), updatedAt = ZonedDateTime.now())

また、TODOと書かれているsave a recordのテストも修正します。

-    // TODO modify something
-    val modified = entity
+    val modified = entity.copy(name = "member1")

最後に、コマンドラインでsbt testを実行してすべて成功すればOKです!

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

MysqlでScalikejdbc入門2 (テスト編)

テスト用DBの設定

前回からの続きです。

まず、テスト用DBのexample_testを作ります。

以下でログインして、

$ mysql -h 127.0.0.1 -uroot -P 4306

DBを作ります。

> create database example_test;

memberテーブルも作成しておきます。

> use example_test;

> CREATE TABLE member
(
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(256) NOT NULL,
  description VARCHAR(1000),
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL,
  PRIMARY KEY (id)
) ENGINE = 'InnoDB', DEFAULT CHARSET=utf8mb4, ROW_FORMAT=DYNAMIC;

application.confにテスト用DB設定を追加します。
ここではtestという名前のコネクション設定を新たに作っています。 example_testにアクセスします。

src/test/resources/test.conf
db.test.driver="com.mysql.jdbc.Driver"
db.test.url="jdbc:mysql://127.0.0.1:4306/example_test"
db.test.user="root"
db.test.password=""

テストコードの修正

class MemberSpecの行の下に以下を設定し、jdbcでテスト用DBへアクセスできるようにします。

src/test/scala/models/MemberSpec.scala
class MemberSpec extends fixture.FlatSpec with Matchers with AutoRollback {
  config.DBs.setup('test)

  override def db = NamedDB('test).toDB
  ...

更に次の行に下記を追加します。
fixtureを定義することで、テスト用DBへ予めテストデータをinsertしておけますので、findのテストを失敗させずにすみます。

src/test/scala/models/MemberSpec.scala
  override def fixture(implicit session: DBSession) {
    sql"insert into member values (1, ${"Alice"}, '', current_timestamp, current_timestamp)".update.apply()
    sql"insert into member values (2, ${"Bob"},  '', current_timestamp, current_timestamp)".update.apply()
  }

create, updateのテストコード修正

そのままだとcreate new recordのテストが失敗します。created_atがnullになっているのが原因なので、修正します。

差分です。

-    val created = Member.create(name = "MyString", createdAt = null, updatedAt = null)
+    val created = Member.create(name = "MyString", createdAt = ZonedDateTime.now(), updatedAt = ZonedDateTime.now())

また、TODOと書かれているsave a recordのテストも修正します。

-    // TODO modify something
-    val modified = entity
+    val modified = entity.copy(name = "member1")

最後に、コマンドラインでsbt testを実行してすべて成功すればOKです!

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

MysqlでScalikeJDBC入門

目的

scalikejdbcをMysqlで動かしてみます。これからscalikejdbcを始める方向けです。

解説したコード全体はこちら: umeneri/scalikejdbc-example: example for scalikejdbc

参考

環境

  • intellij community edition 2018.1
  • scalaVersion 2.12.7
  • sbt.version 1.2.6
  • scalikejdbc 3.3.2

前準備

新規or既存のscalaプロジェクトを立ち上げておきます。

intelljの場合、File > New.. > Projectから、sbtのプロジェクトを作っておきます。

全体の流れ

  1. mysqlのセットアップ
  2. テーブルの作成
  3. コード自動生成
  4. テスト実行 → こちらは別記事

mysqlの立ち上げ

ローカルのmysqlを立ち上げるか、以下のようにdocker-compose.ymlを用意してdocker上で立ち上げます。
dockerでの立ち上げはmacの場合Docker.Appが必要です。

Docker.Appは以下でインストールします。

$ brew cask install docker

docker-compose.ymlの例です。

docker-compose.yml
version: "3"
services:
    example-mysql:
        container_name: example
        image: "mysql:5.6"
        ports:
            - "4306:3306"
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: 1
          MYSQL_DATABASE: "example"

上記docker-composeで立ち上げれば「example」という名前のdatabaseが作成されています。

作成されていない場合は、mysqlにログインして以下で作成です。

create database example;

テーブルの作成

例としてmemberを管理するためのテーブルを作成します。

こちらのスクリプトを作ります。

init.sql
DROP TABLE IF EXISTS member;

CREATE TABLE member
(
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(256) NOT NULL,
  description VARCHAR(1000),
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL,
  PRIMARY KEY (id)
) ENGINE = 'InnoDB', DEFAULT CHARSET=utf8mb4, ROW_FORMAT=DYNAMIC;

insert into member values (1, 'Alice', '', current_timestamp, current_timestamp);
insert into member values (2, 'Bob',  '', current_timestamp, current_timestamp);

memberテーブルを作成します。

$ mysql -h 127.0.0.1 -uroot -P 4306 example < init.sql

build.sbtの設定

build.sbtへ以下を追加。

  • scalikejdbc … 本体
  • scalikejdbc-test … コードの自動生成でテストも生成するため
  • scalikejdbc-config … application.confにscalikejdbc設定を書くため
  • logback-classic … あまり詳しく調べてないのですが、ログ出力に使用
  • mysql-connector-java … mysqlとの連携に必要
  • scalatest … テストコードの自動生成で使用
build.sbt
libraryDependencies ++= Seq(
  "org.scalikejdbc" %% "scalikejdbc" % "3.3.+",
  "org.scalikejdbc" %% "scalikejdbc-test"   % "3.3.+"   % "test",
  "org.scalikejdbc" %% "scalikejdbc-config" % "3.3.+",
  "ch.qos.logback" % "logback-classic" % "1.2.3",
  "mysql" % "mysql-connector-java" % "5.1.29",
  "org.scalatest" %% "scalatest" % "3.0.5" % "test"
)

コードの自動生成

コード自動生成機能を使うため、以下をbuild.sbtへ追加。

enablePlugins(ScalikejdbcPlugin)

自動生成には、以下2つのファイルをprojectディレクトリ直下に入れる必要があります。

scalikejdbc-gen.sbt
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.29"

addSbtPlugin("org.scalikejdbc" %% "scalikejdbc-mapper-generator" % "3.3.+")
scalikejdbc.properties
# ---
# jdbc settings
jdbc.driver="com.mysql.cj.jdbc.Driver"
jdbc.url="jdbc:mysql://127.0.0.1:4306/example"
jdbc.username=root
jdbc.password=
jdbc.schema=

# ---
# source code generator settings

generator.packageName=models
# generator.lineBreak: LF/CRLF
generator.lineBreak=LF
# generator.template: interpolation/queryDsl
generator.template=queryDsl
# generator.testTemplate: specs2unit/specs2acceptance/ScalaTestFlatSpec
generator.testTemplate=ScalaTestFlatSpec
generator.encoding=UTF-8
# When you're using Scala 2.11 or higher, you can use case classes for 22+ columns tables
generator.caseClassOnly=true
# Set AutoSession for implicit DBSession parameter's default value
generator.defaultAutoSession=true
# Use autoConstruct macro (default: false)
generator.autoConstruct=false
# joda-time (org.joda.time.DateTime) or JSR-310 (java.time.ZonedDateTime java.time.OffsetDateTime)
generator.dateTimeClass=java.time.ZonedDateTime

上記ファイルはjdbcのアクセス先URL等を記述します。デフォルトでのアクセス先をexampleとしています。

自動生成実行

それでは自動生成します。

$ sbt "scalikejdbcGenAll"

コマンド実行後、エラーが無ければ以下2ファイルが生成されています。

  • src/main/scala/models/Member.scala
  • src/test/scala/models/MemberSpec.scala

jdbc設定

アプリケーションコードでscalikejdbcを使用するため、application.confに以下設定を書きます。

src/main/resources/application.conf
# JDBC settings
db.default.driver="com.mysql.jdbc.Driver"
db.default.url="jdbc:mysql://127.0.0.1:4306/example"
db.default.user="root"
db.default.password=""

# Connection Pool settings
db.default.poolInitialSize=10
db.default.poolMaxSize=20
db.default.connectionTimeoutMillis=1000

# Connection Pool settings
db.default.poolInitialSize=5
db.default.poolMaxSize=7
db.default.poolConnectionTimeoutMillis=1000
db.default.poolValidationQuery="select 1 as one"
db.default.poolFactoryName="commons-dbcp2"

試しにMemberのデータにアクセスしてみます。

MysqlAccess.scala
package scalike

import models.Member
import scalikejdbc.config._


object MysqlAccess extends App {
  DBs.setupAll()

  val maybeFound = Member.find(1L)
  val name = maybeFound.get.name
  println(name) // => Alice

}

実行すると、実際のDBへのクエリもログに流れるのでデバッグしやすいですね。

  [SQL Execution]
   select m.id as i_on_m, m.name as n_on_m, m.description as d_on_m, m.created_at as ca_on_m, m.updated_at as ua_on_m from member m where m.id = 1; (8 ms)

  [Stack Trace]
    ...
    models.Member$.find(Member.scala:42)
    scalike.mysqlAccess$.delayedEndpoint$scalike$mysqlAccess$1(MysqlAccess.scala:10)
    scalike.mysqlAccess$delayedInit$body.apply(MysqlAccess.scala:7)
    scala.Function0.apply$mcV$sp(Function0.scala:39)
    scala.Function0.apply$mcV$sp$(Function0.scala:39)
    scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
    scala.App.$anonfun$main$1$adapted(App.scala:80)
    scala.collection.immutable.List.foreach(List.scala:392)
    scala.App.main(App.scala:80)
    scala.App.main$(App.scala:78)
    scalike.mysqlAccess$.main(MysqlAccess.scala:7)
    scalike.mysqlAccess.main(MysqlAccess.scala)
    ...

今回生成したテストはそのままでは通らないので、テストを通すよう書き換えます。(次回へ

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

MysqlでScalikejdbc入門

目的

scalikejdbcをMysqlで動かしてみます。これからscalikejdbcを始める方向けです。

参考

環境

  • intellij community edition 2018.1
  • scalaVersion 2.12.7
  • sbt.version 1.2.6
  • scalikejdbc 3.3.2

前準備

新規or既存のscalaプロジェクトを立ち上げておきます。

intelljの場合、File > New.. > Projectから、sbtのプロジェクトを作っておきます。

全体の流れ

  1. mysqlのセットアップ
  2. テーブルの作成
  3. コード自動生成
  4. テスト実行 → こちらは別記事

mysqlの立ち上げ

ローカルのmysqlを立ち上げるか、以下のようにdocker-compose.ymlを用意してdocker上で立ち上げます。
dockerでの立ち上げはmacの場合Docker.Appが必要です。

Docker.Appは以下でインストールします。

$ brew cask install docker

docker-compose.ymlの例です。

docker-compose.yml
version: "3"
services:
    example-mysql:
        container_name: example
        image: "mysql:5.6"
        ports:
            - "4306:3306"
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: 1
          MYSQL_DATABASE: "example"

上記docker-composeで立ち上げれば「example」という名前のdatabaseが作成されています。

作成されていない場合は、mysqlにログインして以下で作成です。

create database example;

テーブルの作成

例としてmemberを管理するためのテーブルを作成します。

こちらのスクリプトを作ります。

init.sql
DROP TABLE IF EXISTS member;

CREATE TABLE member
(
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(256) NOT NULL,
  description VARCHAR(1000),
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL,
  PRIMARY KEY (id)
) ENGINE = 'InnoDB', DEFAULT CHARSET=utf8mb4, ROW_FORMAT=DYNAMIC;

insert into member values (1, 'Alice', '', current_timestamp, current_timestamp);
insert into member values (2, 'Bob',  '', current_timestamp, current_timestamp);

memberテーブルを作成します。

$ mysql -h 127.0.0.1 -uroot -P 4306 example < init.sql

build.sbtの設定

build.sbtへ以下を追加。

  • scalikejdbc … 本体
  • scalikejdbc-test … コードの自動生成でテストも生成するため
  • scalikejdbc-config … application.confにscalikejdbc設定を書くため
  • logback-classic … あまり詳しく調べてないのですが、ログ出力に使用
  • mysql-connector-java … mysqlとの連携に必要
  • scalatest … テストコードの自動生成で使用
build.sbt
libraryDependencies ++= Seq(
  "org.scalikejdbc" %% "scalikejdbc" % "3.3.+",
  "org.scalikejdbc" %% "scalikejdbc-test"   % "3.3.+"   % "test",
  "org.scalikejdbc" %% "scalikejdbc-config" % "3.3.+",
  "ch.qos.logback" % "logback-classic" % "1.2.3",
  "mysql" % "mysql-connector-java" % "5.1.29",
  "org.scalatest" %% "scalatest" % "3.0.5" % "test"
)

コードの自動生成

コード自動生成機能を使うため、以下をbuild.sbtへ追加。

enablePlugins(ScalikejdbcPlugin)

自動生成には、以下2つのファイルをprojectディレクトリ直下に入れる必要があります。

scalikejdbc-gen.sbt
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.29"

addSbtPlugin("org.scalikejdbc" %% "scalikejdbc-mapper-generator" % "3.3.+")
scalikejdbc.properties
# ---
# jdbc settings
jdbc.driver="com.mysql.cj.jdbc.Driver"
jdbc.url="jdbc:mysql://127.0.0.1:4306/example"
jdbc.username=root
jdbc.password=
jdbc.schema=

# ---
# source code generator settings

generator.packageName=models
# generator.lineBreak: LF/CRLF
generator.lineBreak=LF
# generator.template: interpolation/queryDsl
generator.template=queryDsl
# generator.testTemplate: specs2unit/specs2acceptance/ScalaTestFlatSpec
generator.testTemplate=ScalaTestFlatSpec
generator.encoding=UTF-8
# When you're using Scala 2.11 or higher, you can use case classes for 22+ columns tables
generator.caseClassOnly=true
# Set AutoSession for implicit DBSession parameter's default value
generator.defaultAutoSession=true
# Use autoConstruct macro (default: false)
generator.autoConstruct=false
# joda-time (org.joda.time.DateTime) or JSR-310 (java.time.ZonedDateTime java.time.OffsetDateTime)
generator.dateTimeClass=java.time.ZonedDateTime

上記ファイルはjdbcのアクセス先URL等を記述します。デフォルトでのアクセス先をexampleとしています。

自動生成実行

それでは自動生成します。

$ sbt "scalikejdbcGenAll"

コマンド実行後、エラーが無ければ以下2ファイルが生成されています。

  • src/main/scala/models/Member.scala
  • src/test/scala/models/MemberSpec.scala

jdbc設定

アプリケーションコードでscalikejdbcを使用するため、application.confに以下設定を書きます。

src/main/resources/application.conf
# JDBC settings
db.default.driver="com.mysql.jdbc.Driver"
db.default.url="jdbc:mysql://127.0.0.1:4306/example"
db.default.user="root"
db.default.password=""

# Connection Pool settings
db.default.poolInitialSize=10
db.default.poolMaxSize=20
db.default.connectionTimeoutMillis=1000

# Connection Pool settings
db.default.poolInitialSize=5
db.default.poolMaxSize=7
db.default.poolConnectionTimeoutMillis=1000
db.default.poolValidationQuery="select 1 as one"
db.default.poolFactoryName="commons-dbcp2"

試しにMemberのデータにアクセスしてみます。

MysqlAccess.scala
package scalike

import models.Member
import scalikejdbc.config._


object MysqlAccess extends App {
  DBs.setupAll()

  val maybeFound = Member.find(1L)
  val name = maybeFound.get.name
  println(name) // => Alice

}

実行すると、実際のDBへのクエリもログに流れるのでデバッグしやすいですね。

  [SQL Execution]
   select m.id as i_on_m, m.name as n_on_m, m.description as d_on_m, m.created_at as ca_on_m, m.updated_at as ua_on_m from member m where m.id = 1; (8 ms)

  [Stack Trace]
    ...
    models.Member$.find(Member.scala:42)
    scalike.mysqlAccess$.delayedEndpoint$scalike$mysqlAccess$1(MysqlAccess.scala:10)
    scalike.mysqlAccess$delayedInit$body.apply(MysqlAccess.scala:7)
    scala.Function0.apply$mcV$sp(Function0.scala:39)
    scala.Function0.apply$mcV$sp$(Function0.scala:39)
    scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
    scala.App.$anonfun$main$1$adapted(App.scala:80)
    scala.collection.immutable.List.foreach(List.scala:392)
    scala.App.main(App.scala:80)
    scala.App.main$(App.scala:78)
    scalike.mysqlAccess$.main(MysqlAccess.scala:7)
    scalike.mysqlAccess.main(MysqlAccess.scala)
    ...

今回生成したテストはそのままでは通らないので、テストを通すよう書き換えます。(次回へ

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

MySQLの接続についてdatabase.ymlに書ける設定

Railsアプリでデータベースに接続する設定はconfig/database.ymlに書いたり、DATABASE_URL環境変数を設定したりして、与える。database.ymlに書ける内容についての情報がいまいちまとまっていない感じで、調べるのに苦労したのでまとめておく。

設定の例

Rails Guidesに書かれたMySQL設定の例を見ると、こんな感じ。

development:
  adapter: mysql2
  encoding: utf8mb4
  database: blog_development
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock

実用上は、大体ここに書いてあることを設定すればそれで良い。

他にありがちな設定としては、socketではなくhostportを使うこともあったり、sslcaのようなオプションを渡したりすることだと思う。

設定の分類

ActiveRecordの設定は、

  1. Connection poolに関するもの
  2. MySQLの接続に関するもの

の二つがある。

Connection poolの設定

Connection poolの設定には、poolidle_timeoutcheckout_timeoutがあるらしい。

MySQLの接続に関するもの

MySQLに関する設定はActiveRecordによって処理されるものとmysql2 gemによって処理されるものがあり、一覧としては次の通りになる。

  • host (mysql2)
  • username (mysql2)
  • password (mysql2)
  • port (mysql2)
  • database (mysql2)
  • socket (mysql2)
  • flags (mysql2, activerecord)
  • encoding (mysql2, activerecord)
  • read_timeout (mysql2)
  • write_timeout (mysql2)
  • connect_timeout (mysql2)
  • connect_attrs (mysql2)
  • reconnect (mysql2)
  • local_infile (mysql2)
  • secure_auth (mysql2)
  • ssl_mode (mysql2)
  • default_file (mysql2)
  • default_group (mysql2)
  • default_auth (mysql2)
  • init_command (mysql2)
  • sslkey (mysql2)
  • sslcert (mysql2)
  • sslca (mysql2)
  • sslcapath (mysql2)
  • sslcipher (mysql2)
  • sslverify (mysql2)
  • wait_timeout (activerecord)
  • variables (activerecord)
  • strict (activerecord)
  • collation (activerecord)
  • statement_limit (artiverecord)
  • prepared_statements (activerecord)

たくさんあるし、ソースコードをざっと眺めただけなので、もしかしたら欠けているものがあるかもしれない。

(mysql2)と書いたものは、mysql2 gemに渡されて処理されるものなので、ドキュメントを読むこと。

(activerecord)と書いたものは、ActiveRecordによって処理されるもので、とりあえずわかった限りで書いておく。

flags

ActiveRecordはmysql2 gemに渡すflagsをYAMLで良い感じに書くためのサポートを提供している。mysql2のドキュメントに書いてある。

encoding, collation

encodingcollationが指定されているとき、ActiveRecordはMySQLとの接続を確立したときにSQLを自動で発行する。

MySQLで日本語や絵文字を扱うときに重要な設定なので、各自で確認すること。

wait_timeout

wait_timeoutはMySQLの設定に出てくるものと同じで、MySQLに接続したクライアントが切断されるまでのタイムアウトを秒数で指定する。

指定がない場合、RailsがMySQLで設定できる最大の値に自動で設定する。

ちなみに、variables経由ではwait_timeoutは指定できない。(Railsが上書きしてしまうから。)

variables

variablesに書かれている設定をActiveRecordはセッションの設定として指定する。

strict

この項目にはdefaultまたはtruefalseが書ける。省略するとtrueになる。

defaultのときはMySQLのサーバの設定をそのまま見る。trueのときには、STRICT_ALL_TABLESになる。falseのときには、サーバの設定を元にSTRICT_ALL_TABLESSTRICT_TRANS_TABLESTRADITIONAL無効になった設定になる。

これは要するにsql_modeの設定なので、variablesで設定することもできる。(variables.sql_modeで設定したものが優先される。)

statement_limit, prepared_statements

なんか指定できる。(良くわからない。)

DATBASE_URL環境変数経由では?

クエリパラメータとして上記のオプションが設定できる。書いてないものはdatabase.ymlのものが使われる。

が、variablesは指定できない気がする。mysql2://host/db?variables[sql_mode]=STRICT_TRANS_TABLESなどとしても効果がなかった。

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

MetabaseとMySQL環境をDockerで作る

はじめに

株価などネットから取得したデータをMySQLに格納し、
それを可視化したかったのでMetabsaeを試してみました。

環境作成にあたり、Dockerを利用しています。

環境

  • Mac OS X 10.14.2
  • Docker version 18.09.0
  • docker-compose version 1.23.2

参考

今回やりたい構成

Metabase_MySQL.png

ディレクトリ構成

.
├── Data
│   └── mysql_data
└── Docker
    └── docker-compose.yml

永続化のためmysql_dataにMySQLのファイルを置きます。

環境作成

イメージがないこと確認

$ docker-compose images
Container   Repository   Tag   Image Id   Size
----------------------------------------------

docker compose用のファイル準備

docker-compose.ymlでみて欲しいところは以下

  • linksにmysqlと記載することで、Docker内はmysqlで名前解決できる。

  • volumesにローカルのファイルをDockerコンテナにマウントする設定を記載することによってMySQLのデータをローカルに保存している。その結果データを永続化できる。

docker-compose.yml
version: "3"
services:
  metabase:
    container_name: metabase
    image: metabase/metabase
    ports:
      - "3000:3000"
    links:
      - mysql
  mysql:
    container_name: mysql
    image: mysql:5.7.22
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: stock
      MYSQL_USER: stock
      MYSQL_PASSWORD: stock
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ../Data/mysql_data/:/var/lib/mysql

イメージを取得

$ docker-compose create
WARNING: The create command is deprecated. Use the up command with the --no-start flag instead.
Pulling mysql (mysql:5.7.22)...
5.7.22: Pulling from library/mysql
be8881be8156: Pull complete
c3995dabd1d7: Pull complete
9931fdda3586: Pull complete
bb1b6b6eff6a: Pull complete
a65f125fa718: Pull complete
2d9f8dd09be2: Pull complete
37b912cb2afe: Pull complete
79592d21cb7f: Pull complete
00bfe968d82d: Pull complete
79cf546d4770: Pull complete
2b3c2e6bacee: Pull complete
Pulling metabase (metabase/metabase:)...
latest: Pulling from metabase/metabase
4fe2ade4980c: Already exists
6fc58a8d4ae4: Pull complete
819f4a45746c: Pull complete
cfead1870569: Pull complete
80eef12953dc: Pull complete
8ea161a68113: Pull complete
db7c1ab963fb: Pull complete
Creating mysql ... done
Creating metabase ... done

$ docker-compose images
Container      Repository        Tag       Image Id      Size
--------------------------------------------------------------
metabase    metabase/metabase   latest   0e41d8de8452   221 MB
mysql       mysql               5.7.22   6bb891430fb6   355 MB

起動

$ docker-compose up -d
Starting mysql ... done
Starting metabase ... done

-dをつけてデタッチドモードにしないと、ターミナルに戻ってこれない。

動作確認(MySQL)

$ mysql --host=127.0.0.1 --user=stock --password
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| stock              |
+--------------------+
2 rows in set (0.02 sec)

Metabaseの設定

初期セットアップ

http://localhost:3000/setup

にアクセス

ss_Metabase_01.png

ss_Metabase_02.png

ss_Metabase_03.png

docker-compose.ymlのlinksに記載したmysqlがホスト名

ss_Metabase_05.png

ss_Metabase_06.png

ss_Metabase_07.png

今回は事前にデータをMySQLに表を作成していたので、MySQLに入っている表の一覧が表示される。

ss_Metabase_08.png

表の名前をクリックすると、勝手にSummaryしている。

ss_Metabase_09.png

もちろん表のデータから色々なグラフ(円グラフや棒グラフ、線グラフ)などをSQLからも作成可能。

ss_Metabase_10.png

おまけ

停止

$ docker-compose stop
Stopping metabase ... done
Stopping mysql    ... done

起動(環境削除していない場合)

$ docker-compose start
Starting mysql    ... done
Starting metabase ... done

環境削除

コンテナを停止し、そのコンテナとネットワークを削除

$ docker-compose down
$ docker-compose down
Stopping metabase ... done
Stopping mysql    ... done
Removing metabase ... done
Removing mysql    ... done
Removing network docker_default

環境削除(imageも削除)

上に加えて、imageも削除

$ docker-compose down --rmi all
Removing metabase ... done
Removing mysql    ... done
Removing network docker_default
Removing image mysql:5.7.22
Removing image metabase/metabase
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む