0
0

More than 3 years have passed since last update.

golang × SQLite3 でLIKE句を使う

Posted at

はじめに

Go言語の基礎を1~2週間ほど学び、CRUD機能を持つ簡単なwebアプリを作成しました。
その過程のデーターベース操作で躓き(LIKE句)調べても中々解決に繋がる記事を見つけられなかったので
この記事を書くことにしました。

https://qiita.com/__init__/items/2edfc7acf11234e5b1aa
上記の記事にて基本的なデータベース操作は書かれています。
初めてQiita記事を書くのでとりあえず今回は自分が躓いたLIKE句のことのみ記事にしてみます。

環境

バージョン:go 1.15.3

db:SQLite3

PC:Mac

事前準備

golang、SQLite3、go-sqlite3のインストール

※先ほどの記事でインストール手順も詳しく書かれています。
https://qiita.com/__init__/items/2edfc7acf11234e5b1aa

テーブル作成と中身

まずはテーブル作成

package main

import (
    "database/sql"
    _ "github.com/mattn/go-sqlite3"
    "log"
)

var DbConnection *sql.DB

type Uset struct {
    Id   int
    Name string
    Age  int
}

func main() {
    DbConnection, err := sql.Open("sqlite3", "../example.sql")
    if err != nil {
        log.Fatalln(err)
    }
    defer DbConnection.Close()

    cmd := `CREATE TABLE IF NOT EXISTS user(id INTEGER PRIMARY KEY,
    name STRING,
    age INT)`
    _, err = DbConnection.Exec(cmd)
    if err != nil {
        log.Fatalln(err)
    }
}

結果
$ sqlite3 example.sql
SQLite version 3.28.0 2019-04-15 14:49:49
Enter ".help" for usage hints.
sqlite> .table
user
sqlite> 
データの中身
sqlite> select * from user;
1|yamada|20
2|yamamoto|22
3|suzuki|19
4|tanaka|15
5|miyamoto|30
sqlite> 

レコードを5つ入れておきました。
左から、id name age です

LIKE句

うまくいったコード

cmd := "SELECT * FROM user WHERE name LIKE ?"
rows, err := Dbconnection.Query(cmd, "%yamada%")
if err != nil {
    log.Println(err)
}
defer rows.Close()
var users []User
for rows.Next() {
    var user User
    err = rows.Scan(&user.Id, &m.Name, &m.Age)
    if err != nil {
        log.Println(err)
    }
users = append(users, user)

fmt.Println(users)
結果
$ go run main.go
[{1 yamada 20}]


うまくいかなかったコード

cmd := "SELECT * FROM user WHERE name LIKE '%?%'" //←ここ
rows, err := DbConnection.Query(cmd, "yamada")

// 結果
 go run main.go
[]

『?』 の部分に値を渡すのですが
先に『%%』で囲っておくのではなく『"%yamada%"』のように『%』と一緒に値を渡さないとダメでした。
Python×SQLiteのLIKE句の記事を見つけ参考にしました。


ターミナルなどでは

sqlite> select * from user where name like '%yamada%';
1|yamada|20

でいけます。

整数も同じようにいけます

cmd := "SELECT * FROM user WHERE age LIKE ?"
rows, err := DbConnection.Query(cmd, "%1%")

// 結果
[{3 suzuki 19} {4 tanaka 15}]

他の使用パターン

任意の文字列から始まるレコードを取得するとき

cmd := "SELECT * FROM user WHERE name LIKE ?"
rows, err := DbConnection.Query(cmd, "y%")

// 結果
[{1 yamada 20} {2 yamamoto 22}]

『m』が二回くるデータを取得

cmd := "SELECT * FROM user WHERE name LIKE ?"
rows, err := DbConnection.Query(cmd, "%m%m%")

// 結果
[{2 yamamoto 22} {5 miyamoto 30}]

任意の長さのカラムを持つデータを取得(サンプルでは6文字)

cmd := "SELECT * FROM user WHERE name LIKE ?"
rows, err := DbConnection.Query(cmd, "______")

// 結果
[{1 yamada 20} {3 suzuki 19} {4 tanaka 15}]

最後に

同じように躓く方がいるかわかりませんが、誰かの参考になると幸いです。(コードの詳細まで書きたかったのですが不慣れなせいかここまでかなり時間がかかってしまったのですいません。)
実際に簡単なアプリを作成してみてgolangはRailsのように情報量が豊富ではないと実感したので
今後golangの学習の中で気づいたことなどを記事にしていけたらと思います。
最後まで見ていただきありがとうございました。

0
0
0

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
0
0