CrystalでSqlite3のデータベースからSELECTする方法

事前の設定

Sqlite3を使うにはsqlite3をrequireする必要があるので、shards.ymlのdependenciesに以下を追加して

dependencies:
  sqlite3:
    github: crystal-lang/crystal-sqlite3
$ shards install

を実行します。

userテーブル内のデータ

id(INT) name(TEXT) created_at(datetime)
1 Freud 2019-02-23 00:23:12.000
2 Jung 2019-02-23 00:23:12.000
3 Adler 2019-02-23 00:23:12.000

1件データを取得

query_oneというメソッドがあるので、これを使って取得すると簡単に1件取得できます。 その際、asで型を指定する必要があります。

require "sqlite3"

DB.open "sqlite3://./app.db" do |db|
  id, name, created_at = db.query_one "SELECT id, name, created_at FROM user LIMIT 1", as: {Int32, String, Time}
  puts "id: #{id}, name: #{name}, created_at: #{created_at}"
end

実行結果

$ crystal app.cr
id: 1, name: Freud, created_at: 2019-02-23 00:23:12 UTC

複数のデータを取得

データを取得するにはqueryというメソッドを使用します。 これを実行するとブロック引数にResultSetという型のデータが返ってくるのでそれに対してreadで型を指定して取得します。

require "sqlite3"

DB.open "sqlite3://./app.db" do |db|
  db.query "SELECT id, name, created_at FROM user"  do |rs|
    user = Hash(Symbol, Int32 | String | Time).new
    rs.each do
      id = rs.read(Int32)
      name = rs.read(String)
      created_at = rs.read(Time)
      puts "id: #{id}, name: #{name}, created_at: #{created_at}"
    end
  end
end

実行結果

$ crystal app.cr
id: 1, name: Freud, created_at: 2019-02-23 00:23:12 UTC
id: 2, name: Jung, created_at: 2019-02-23 00:23:12 UTC
id: 3, name: Adler, created_at: 2019-02-23 00:23:12 UTC