LoginSignup
4
1

More than 3 years have passed since last update.

CrystalでMySQLを使う方法

Last updated at Posted at 2017-07-15

環境

  • Ubuntu 16.04 LTS
  • Mysql5.7自体はapt-getでインストール済み
    • パスワードなしで接続できるようにしてあります
  • crenv
    • 0.23.0

Crystal用にしたこと

  1. $ shards initshard.ymlを用意
  2. 以下を追記

    dependencies:
      mysql:
        github: crystal-lang/crystal-mysql
    
  3. $ shards install crystal-mysqlで使用可能になる

  4. shard.yml, shard.lockのある階層で$ crystal hoge.crを実行

MySQLの準備


mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> create table langs (id int, name varchar(32));
Query OK, 0 rows affected (0.01 sec)
mysql>  insert into langs (id, name) values (1, "Ruby"),(2, "Python"),(3, "Java");
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from langs;
+------+--------+
| id   | name   |
+------+--------+
|    1 | Ruby   |
|    2 | Python |
|    3 | Java   |
+------+--------+
3 rows in set (0.00 sec)

コード

  • テーブルの参照
mysql_s1.cr
require "mysql"

DB.open "mysql://root@localhost/test" do |db|
  db.query "select id, name from langs" do |rs|
    puts "#{rs.column_name(0)}\t#{rs.column_name(1)}"
    rs.each do
      puts "#{rs.read(Int32)}\t#{rs.read(String)}"
    end
  end
end
$ crystal cr/mysql_s1.cr 
id  name
1   Ruby
2   Python
3   Java
  • データの挿入
mysql_s2.cr
require "mysql"

DB.open "mysql://root@localhost/test" do |db|
  db.exec "insert into langs values (?, ?)", 4, "Crystal"

  db.query "select id, name from langs" do |rs|
    puts "#{rs.column_name(0)}\t#{rs.column_name(1)}"
    rs.each do
      puts "#{rs.read(Int32)}\t#{rs.read(String)}"
    end
  end
end
$ crystal cr/mysql_s2.cr 
id  name
1   Ruby
2   Python
3   Java
4   Crystal
  • データの更新
mysql_s3.cr
require "mysql"

DB.open "mysql://root@localhost/test" do |db|
  db.exec "update langs set name = ? where id = ? ", "Whitespace", 4

  db.query "select id, name from langs" do |rs|
    puts "#{rs.column_name(0)}\t#{rs.column_name(1)}"
    rs.each do
      puts "#{rs.read(Int32)}\t#{rs.read(String)}"
    end
  end
end

$ crystal cr/mysql_s3.cr 
id  name
1   Ruby
2   Python
3   Java
4   Whitespace
  • データの削除
mysql_s4.cr
require "mysql"

DB.open "mysql://root@localhost/test" do |db|
  db.exec "delete from langs where id = ? ", 4

  db.query "select id, name from langs" do |rs|
    puts "#{rs.column_name(0)}\t#{rs.column_name(1)}"
    rs.each do
      puts "#{rs.read(Int32)}\t#{rs.read(String)}"
    end
  end
end
$ crystal cr/mysql_s4.cr 
id  name
1   Ruby
2   Python
3   Java

参考にしたサイト

追記(2019/10/15)

DBにパスワードがある場合は、@kazto さんにコメントで指摘していただいたように

DB.open "mysql://root:password@localhost:port/test" do |db|
  # 処理
end

とすれば良いです。

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1