- 投稿日:2019-01-26T21:48:12+09:00
mysqlの操作方法についての基本まとめ
mysqlに入る
rootユーザーで入る
mysql -u rootrootユーザー以外で入る
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
- 投稿日:2019-01-26T16:14:58+09:00
MySQLユーザ作成について
私は今までPHP学習にMySQLを使ってきていましたが、ユーザや権限周りをあまり触ってきませんでした。
DB操作は全てroot権限で行なっていました。ユーザ作成や権限周りに触れる機会があったので、自分用にまとめてみようと思います。DBにアクセス
$ mysql -u root -pMySQLユーザー作成
ユーザの確認
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が詳しいので参考になりました。
- 投稿日:2019-01-26T15:29:22+09:00
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
これから、カラムを追加したり、新しいテーブルを作成するので、どうなるのでしょうか。とりあえず進めていきます。
- 投稿日:2019-01-26T09:03:30+09:00
MysqlでScalikeJDBC入門2 (テスト編)
目的
mysqlでscalikeJDBCのコード自動生成を行い、テストまで通します。
解説したコード全体はこちら: umeneri/scalikejdbc-example: example for scalikejdbc
テスト用DBの設定
前回からの続きです。
まず、テスト用DBのexample_testを作ります。
以下でログインして、
$ mysql -h 127.0.0.1 -uroot -P 4306DBを作ります。
> 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.confdb.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.scalaclass 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.scalaoverride 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です!
- 投稿日:2019-01-26T09:03:30+09:00
MysqlでScalikejdbc入門2 (テスト編)
テスト用DBの設定
前回からの続きです。
まず、テスト用DBのexample_testを作ります。
以下でログインして、
$ mysql -h 127.0.0.1 -uroot -P 4306DBを作ります。
> 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.confdb.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.scalaclass 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.scalaoverride 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です!
- 投稿日:2019-01-26T09:02:43+09:00
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のプロジェクトを作っておきます。
全体の流れ
- mysqlのセットアップ
- テーブルの作成
- コード自動生成
- テスト実行 → こちらは別記事
mysqlの立ち上げ
ローカルのmysqlを立ち上げるか、以下のようにdocker-compose.ymlを用意してdocker上で立ち上げます。
dockerでの立ち上げはmacの場合Docker.Appが必要です。Docker.Appは以下でインストールします。
$ brew cask install dockerdocker-compose.ymlの例です。
docker-compose.ymlversion: "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.sqlDROP 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.sqlbuild.sbtの設定
build.sbtへ以下を追加。
- scalikejdbc … 本体
- scalikejdbc-test … コードの自動生成でテストも生成するため
- scalikejdbc-config … application.confにscalikejdbc設定を書くため
- logback-classic … あまり詳しく調べてないのですが、ログ出力に使用
- mysql-connector-java … mysqlとの連携に必要
- scalatest … テストコードの自動生成で使用
build.sbtlibraryDependencies ++= 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.sbtlibraryDependencies += "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.scalapackage 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) ...今回生成したテストはそのままでは通らないので、テストを通すよう書き換えます。(次回へ)
- 投稿日:2019-01-26T09:02:43+09:00
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のプロジェクトを作っておきます。
全体の流れ
- mysqlのセットアップ
- テーブルの作成
- コード自動生成
- テスト実行 → こちらは別記事
mysqlの立ち上げ
ローカルのmysqlを立ち上げるか、以下のようにdocker-compose.ymlを用意してdocker上で立ち上げます。
dockerでの立ち上げはmacの場合Docker.Appが必要です。Docker.Appは以下でインストールします。
$ brew cask install dockerdocker-compose.ymlの例です。
docker-compose.ymlversion: "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.sqlDROP 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.sqlbuild.sbtの設定
build.sbtへ以下を追加。
- scalikejdbc … 本体
- scalikejdbc-test … コードの自動生成でテストも生成するため
- scalikejdbc-config … application.confにscalikejdbc設定を書くため
- logback-classic … あまり詳しく調べてないのですが、ログ出力に使用
- mysql-connector-java … mysqlとの連携に必要
- scalatest … テストコードの自動生成で使用
build.sbtlibraryDependencies ++= 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.sbtlibraryDependencies += "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.scalapackage 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) ...今回生成したテストはそのままでは通らないので、テストを通すよう書き換えます。(次回へ)
- 投稿日:2019-01-26T02:40:07+09:00
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
ではなくhost
とport
を使うこともあったり、sslca
のようなオプションを渡したりすることだと思う。設定の分類
ActiveRecordの設定は、
- Connection poolに関するもの
- MySQLの接続に関するもの
の二つがある。
Connection poolの設定
Connection poolの設定には、
pool
、idle_timeout
、checkout_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
encoding
とcollation
が指定されているとき、ActiveRecordはMySQLとの接続を確立したときにSQLを自動で発行する。MySQLで日本語や絵文字を扱うときに重要な設定なので、各自で確認すること。
wait_timeout
wait_timeout
はMySQLの設定に出てくるものと同じで、MySQLに接続したクライアントが切断されるまでのタイムアウトを秒数で指定する。指定がない場合、RailsがMySQLで設定できる最大の値に自動で設定する。
ちなみに、
variables
経由ではwait_timeout
は指定できない。(Railsが上書きしてしまうから。)
variables
variables
に書かれている設定をActiveRecordはセッションの設定として指定する。
strict
この項目には
default
またはtrue
かfalse
が書ける。省略するとtrue
になる。
default
のときはMySQLのサーバの設定をそのまま見る。true
のときには、STRICT_ALL_TABLES
になる。false
のときには、サーバの設定を元にSTRICT_ALL_TABLES
とSTRICT_TRANS_TABLES
とTRADITIONAL
が無効になった設定になる。これは要するに
sql_mode
の設定なので、variables
で設定することもできる。(variables.sql_mode
で設定したものが優先される。)
statement_limit
,prepared_statements
なんか指定できる。(良くわからない。)
DATBASE_URL
環境変数経由では?クエリパラメータとして上記のオプションが設定できる。書いてないものは
database.yml
のものが使われる。が、
variables
は指定できない気がする。mysql2://host/db?variables[sql_mode]=STRICT_TRANS_TABLES
などとしても効果がなかった。
- 投稿日:2019-01-26T01:51:22+09:00
MetabaseとMySQL環境をDockerで作る
はじめに
株価などネットから取得したデータをMySQLに格納し、
それを可視化したかったのでMetabsaeを試してみました。
環境作成にあたり、Dockerを利用しています。環境
- Mac OS X 10.14.2
- Docker version 18.09.0
- docker-compose version 1.23.2
参考
今回やりたい構成
ディレクトリ構成
. ├── 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.ymlversion: "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
にアクセスdocker-compose.ymlの
links
に記載したmysqlがホスト名今回は事前にデータをMySQLに表を作成していたので、MySQLに入っている表の一覧が表示される。
表の名前をクリックすると、勝手にSummaryしている。
もちろん表のデータから色々なグラフ(円グラフや棒グラフ、線グラフ)などをSQLからも作成可能。
おまけ
停止
$ 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