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

1日目 ruby基礎,rails_scaffold(スキャフォールド)

文字コードの設定

ソースコードの文字コードをUS-ASCIIに設定する時は以下の3つのどの書きかたでも合ってる。
# coding: us-ascii
# encoding: us-ascii
# CODING: US-ASCII

変数と定数

rubyの場合、変数を定義する時は、小文字、定数を定義する時は、最初の文字が、大文字。以下に例を示す。
komozi=1
Oomozi=3.14

例外処理(begin rescue ensure)

beginの処理がエラーだった場合に、rescueの処理が実行される。ensureには、beginの処理がエラーでも、エラーじゃなくても処理される。

三項演算子

以下の2つの実行結果は同じである。

x = 10
y = x < 10 ? "A" : "B"

puts y
x = 10
y = nil
if x < 10
  y = "A"
else
  y = "B"
end
puts y

引数(*a)

以下のようにコードを書くと、実行結果が配列として出てくる。

def foo(*a)
  p a
end

foo(1,2,3)

繰り返し

繰り返しはeach,step,uptoメソットがある。
以下は例文。
・each

money = 1000
(1..10).each do
  (1..10).each do
    money = money + 1
  end
end

puts money

・step

money = 1000
rate = 1.1
(2001..2010).step(2) do |i|
  money = money * rate
end
puts money.to_i

 ・upto

money = 1000
rate = 1.1
2001.upto(2004) do
  money = money * rate
end
puts money.to_i

scaffold(スキャフォールド)

ruby on rails でアプリケションを作る際の便利ツール。本来、railsでは、モデル、コントローラー、ビュー、ルーティングを作る必要があるが、scaffoldを使えば、これらの作業をまとめて行って、簡単にアプリケーションの雛形を作ってくれる。

今日の授業の感想

今日はRubyの基礎を午前に行い、午後はscaffoldを用いて、フォームを作成した。午前は問題に出されたコードが、どのような処理を行うのかを学び、色んな発見があって理解が深まった。しかし、午後の授業に追いついて行けなかった。railsの環境構築も行ったが、〜をして、次に〜をしてくださいと言われても、どこで実行すればいいのかもわからず、(macでとか、mysql、railsとか)、専門用語も多いので、それが何の意味を指していて、なんでそれを実行する意味があるのかもわからず、自分の非力さを感じた。現在何をしているのかが全く分からなかった。事前課題はprogateで指定されたことを一通り行ったが、それだけではついていけなかった。授業の復習を行い、少しずつ理解を深めて行きたい。

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

2日目 ruby基礎,rails_scaffold(スキャフォールド)

文字コードの設定

ソースコードの文字コードをUS-ASCIIに設定する時は以下の3つのどの書きかたでも合ってる。
# coding: us-ascii
# encoding: us-ascii
# CODING: US-ASCII

変数と定数

rubyの場合、変数を定義する時は、小文字、定数を定義する時は、最初の文字が、大文字。以下に例を示す。
komozi=1
Oomozi=3.14

例外処理(begin rescue ensure)

beginの処理がエラーだった場合に、rescueの処理が実行される。ensureには、beginの処理がエラーでも、エラーじゃなくても処理される。

三項演算子

以下の2つの実行結果は同じである。

x = 10
y = x < 10 ? "A" : "B"

puts y
x = 10
y = nil
if x < 10
  y = "A"
else
  y = "B"
end
puts y

引数(*a)

以下のようにコードを書くと、実行結果が配列として出てくる。

def foo(*a)
  p a
end

foo(1,2,3)

繰り返し

繰り返しはeach,step,uptoメソットがある。
以下は例文。
・each

money = 1000
(1..10).each do
  (1..10).each do
    money = money + 1
  end
end

puts money

・step

money = 1000
rate = 1.1
(2001..2010).step(2) do |i|
  money = money * rate
end
puts money.to_i

 ・upto

money = 1000
rate = 1.1
2001.upto(2004) do
  money = money * rate
end
puts money.to_i

scaffold(スキャフォールド)

ruby on rails でアプリケションを作る際の便利ツール。本来、railsでは、モデル、コントローラー、ビュー、ルーティングを作る必要があるが、scaffoldを使えば、これらの作業をまとめて行って、簡単にアプリケーションの雛形を作ってくれる。

今日の授業の感想

今日はRubyの基礎を午前に行い、午後はscaffoldを用いて、フォームを作成した。午前は問題に出されたコードが、どのような処理を行うのかを学び、色んな発見があって理解が深まった。しかし、午後の授業に追いついて行けなかった。railsの環境構築も行ったが、〜をして、次に〜をしてくださいと言われても、どこで実行すればいいのかもわからず、(macでとか、mysql、railsとか)、専門用語も多いので、それが何の意味を指していて、なんでそれを実行する意味があるのかもわからず、自分の非力さを感じた。現在何をしているのかが全く分からなかった。事前課題はprogateで指定されたことを一通り行ったが、それだけではついていけなかった。授業の復習を行い、少しずつ理解を深めて行きたい。

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

macOSのコマンドラインでphpからMAMPのMySQLに接続しようとすると[2002] No such file or directory

NetCommos3をcomposerでインストール · NetCommons3/NetCommons3 Wiki を参考にしながら macOS のコマンドライン上でNetCommons3をインストールしてたら、DB作成の時点で

Error: SQLSTATE[HY000] [2002] No such file or directory
Error: データベースが作成できませんでした。

となってしまいました。

なぜこうなるかというとMAMPを入れてるとはいっても、コマンドラインで動くのは macOSにデフォルトで入ってるPHPだから。

MAMPのMySQLのソケットの場所は /Application/MAMP/tmp/mysql/mysql.sock

それに対して macOS のPHPが参照する MySQLソケットの位置は /var/mysql/mysql.sock

それで /var/mysql/mysql.sock が見つからないということで "No such file or directory" になってたわけです。

というわけで下記を実行してシンボリックリンクをつくることで解決できました。

sudo mkdir /var/mysql
sudo ln -s /Application/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLのGenerated Columnsまとめ with Rails

Geneterated Columnとは

  • 実カラムの値を計算した結果 を格納する専⽤のカラムを作成できる
  • 関数indexをシミュレートできる(生成列にindexを貼れるし、生成列で分割もできる)
  • MySQL5.7から使える。
  • Oracleの仮想列に近い。
  • CREATE TABLEまたはALTER TABLE文の中で使用できる。
  • [GENERATED ALWAYS] as (expression) の構文で作成する。

作成

CREATE TABLE triangle (
  sidea DOUBLE,
  sideb DOUBLE,
  sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))
);

データの挿入

INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);

確認

mysql> select * from triangle;
+-------+-------+--------------------+
| sidea | sideb | sidec              |
+-------+-------+--------------------+
|     1 |     1 | 1.4142135623730951 |
|     3 |     4 |                  5 |
|     6 |     8 |                 10 |
+-------+-------+--------------------+
3 rows in set (0.01 sec)

何故 Geneterated Column を使うのか

  • データの保存用途ではなく、仮想生成した列は、
    照会を単純化し統一するための方法として使用できる。
    複雑な条件は、生成された列として定義することで、
    確実に同じ条件を使用するようにできる。

  • 格納された生成列は、その場で計算するのにコストがかかる
    複雑な条件のためのキャッシュとして使用できる。

  • Geneterated Columnは関数インデックスをシミュレートできる。
    Geneterated Columnを使用して関数式を定義し、
    それにインデックスを付けることもできる。

    • 生成された列にNOT NULL制約・UNIQUE制約をかけられる。
    • 生成された列で分割(partitioning)ができる。
    • 生成された列にインデックスが付けられている場合、クエリがその列を直接名前で参照していなくても、
      オプティマイザは列の定義と一致するクエリ式を認識し、
      クエリ実行中にその列のインデックスを適切に使用する
      https://dev.mysql.com/doc/refman/5.7/en/generated-column-index-optimizations.html

データの持ち方

  • Geneterated Columnは VIRTUAL または STOREDを指定することができる。
    デフォルトは VIRTUALである。
  • テーブル内に VIRTUAL と STORED は混在できる
  • どちらのタイプもセカンダリーインデックスを作成できる。
  • セカンダリーインデックスはどちらのタイプでもDiskに固定できる。

STORED

  • 列の値は、行が挿入または更新されたときに評価されて保管される。
  • ストレージを必要とする。
  • indexを貼れる。

VIRTUAL

  • SELECT時に都度計算される。
  • ストレージを必要としない。
  • MySQL 5.7.8から、計算後のデータに対してインデックスが貼れる

注意点

  • 生成された列式は、以下の規則に従う必要があり、
    式に許可されていない構成が含まれていると、エラーが発生する。

    • ストアドファンクション・ユーザー定義関数は不許可
    • ストアドプロシージャと関数パラメータは不許可
    • 変数(システム変数、ユーザー定義変数、およびストアドプログラムローカル変数)は不許可
    • サブクエリは許可されない
    • AUTO_INCREMENT属性は列の定義で使用できない
  • カラムとしては定義されているので、 SELECT * とかはできるが、
    Insert のように直接値を投入することはできない。

  • 式が宣言された列型とは異なるデータ型に評価された場合、
    宣言された型への暗黙的な強制は通常のMySQLの型変換規則に従って発生する。

  • 外部キー制約は仮想生成した列を参照できない。

Railsで実装する場合

テーブル作成時に追加する方法

class CreateTriangle < ActiveRecord::Migration[5.1]
  def change
    create_table :triangle do |t|
      t.integer :sidea
      t.integer :sideb
      t.virtual :sidec, type: :float,  as: "SQRT(sidea * sidea + sideb * sideb)"
      t.virtual :sided, type: :float,  as: "SQRT(sidea * sidea + sideb * sideb)", stored: true
    end
  end
end

テーブルの確認

mysql> show create table triangle;
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                                                                                                                                                                                    |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| triangle | CREATE TABLE `triangle` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `sidea` int(11) DEFAULT NULL,
  `sideb` int(11) DEFAULT NULL,
  `sidec` float GENERATED ALWAYS AS (sqrt(((`sidea` * `sidea`) + (`sideb` * `sideb`)))) VIRTUAL,
  `sided` float GENERATED ALWAYS AS (sqrt(((`sidea` * `sidea`) + (`sideb` * `sideb`)))) STORED,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

データの挿入

INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);

確認

mysql> select * from triangle;
+----+-------+-------+---------+---------+
| id | sidea | sideb | sidec   | sided   |
+----+-------+-------+---------+---------+
|  1 |     1 |     1 | 1.41421 | 1.41421 |
|  2 |     3 |     4 |       5 |       5 |
|  3 |     6 |     8 |      10 |      10 |
+----+-------+-------+---------+---------+
3 rows in set (0.00 sec)

カラムとして追加

class AddColumnToTriangle < ActiveRecord::Migration[5.1]
  def up
    execute "ALTER TABLE triangle ADD COLUMN sidee float AS (
      CASE WHEN sidea > 2 THEN SQRT(sidea * sidea + sideb * sideb)
      ELSE NULL END
    )"

    add_index :triangle, :sidee, unique: true
  end

  def down
    remove_column :triangle, :sidee
  end
end

テーブルの確認

mysql> show create table triangle;
+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| triangle | CREATE TABLE `triangle` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `sidea` int(11) DEFAULT NULL,
  `sideb` int(11) DEFAULT NULL,
  `sidec` float GENERATED ALWAYS AS (sqrt(((`sidea` * `sidea`) + (`sideb` * `sideb`)))) VIRTUAL,
  `sided` float GENERATED ALWAYS AS (sqrt(((`sidea` * `sidea`) + (`sideb` * `sideb`)))) STORED,
  `sidee` float GENERATED ALWAYS AS ((case when (`sidea` > 2) then sqrt(((`sidea` * `sidea`) + (`sideb` * `sideb`))) else NULL end)) VIRTUAL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_triangle_on_sidee` (`sidee`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 |
+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

確認

mysql> select * from triangle;
+----+-------+-------+---------+---------+-------+
| id | sidea | sideb | sidec   | sided   | sidee |
+----+-------+-------+---------+---------+-------+
|  1 |     1 |     1 | 1.41421 | 1.41421 |  NULL |
|  2 |     3 |     4 |       5 |       5 |     5 |
|  3 |     6 |     8 |      10 |      10 |    10 |
+----+-------+-------+---------+---------+-------+
3 rows in set (0.00 sec)

参考

MySQL 5.7にやられないためにおぼえておいてほしいこと
https://www.slideshare.net/yoku0825/mysql-57-53449734

13.1.18.8 CREATE TABLE and Generated Columns
https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html

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

MySQLチートシート

mysqldumpで特定のdbをgzipでバックアップ&リストア

バックアップ

mysqldump -u ${user} -p --single-transaction ${db_name} --ignore-table=mysql.event | gzip > ${db_name}.dmp.gz.`date +%Y%m%d`

リストア

zcat ${db_name}.dmp.gz.`date +%Y%m%d` | mysql -u ${user} -p ${db_name}

全テーブルの大雑把なレコード数を一覧表示する

各テーブルのレコード数を確認したい時に使用する。例えばレプリケーションやリストアの確認の時など。

ただし、information_schemaはわりと大雑把なので、完全に一致しないこともあるので注意。
その場合は select count する。
公式ドキュメントにも以下のように記載がある。

For InnoDB tables, the row count is only a rough estimate used in SQL
optimization. (This is also true if the InnoDB table is partitioned.)

全DBの全テーブル

mysql> select table_name, table_rows from information_schema.TABLES;

特定のDBの全テーブル

mysql> select table_name, table_rows from information_schema.TABLES where table_schema = '${db_name}';
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mysqlで直積を使ったテストデータ生成

考えるな、感じろ。

insert into tweet (user_id ,is_private, text,content, liked,retweeted, timestamp) values
(1, 1,'csdgrthw',null, 0,4,CURRENT_TIMESTAMP),
(2, 0,'vfdbjkjbsda',null,1,5, CURRENT_TIMESTAMP),
(3, 0,'xcasdfeabbag',null,1,3, CURRENT_TIMESTAMP),
(4, 0,'opjkhgfdsfsvewhy',null,1,3, CURRENT_TIMESTAMP),
(5, 0,'saoikjrepok',null,3, 8,CURRENT_TIMESTAMP);

drop table if exists tweet1;
create table tweet1(
  `user_id` bigint not null,
  `is_private` bool,
  `text` varchar(255)
);
create table tweet2(
  `content` varchar(255) null,
  `liked` int default 0,
  `retweeted` int default 0,
  `timestamp` timestamp
);

insert into tweet1(user_id ,is_private, text) values
(1, 1,'csdgrthw'),
(2, 0,'vfdbjkjbsda'),
(3, 0,'xcasdfeabbag'),
(4, 0,'opjkhgfdsfsvewhy'),
(5, 0,'saoikjrepok');

insert into tweet2(content,liked,retweeted,timestamp) values
(null, 0,4,CURRENT_TIMESTAMP),
(null,1,5, CURRENT_TIMESTAMP),
(null,1,3, CURRENT_TIMESTAMP),
(null,1,3, CURRENT_TIMESTAMP),
(null,3, 8,CURRENT_TIMESTAMP);

drop table if exists tweet3;
create table tweet3(
  `content` varchar(255) null,
  `liked` int default 0,
  `retweeted` int default 0,
  `timestamp` timestamp
);

insert into tweet3(content,liked,retweeted,timestamp) values
(null, 0,4,CURRENT_TIMESTAMP),
(null,1,5, CURRENT_TIMESTAMP),
(null,1,3, CURRENT_TIMESTAMP),
(null,1,3, CURRENT_TIMESTAMP),
(null,3, 8,CURRENT_TIMESTAMP);

insert into tweet(user_id,is_private,text,content,liked,retweeted,timestamp)
select A.*, B.* from tweet1 A join tweet2 B;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む