Help us understand the problem. What is going on with this article?

gorp(go-mysql-driver)で独自に定義した型をカラムに割り当てる

More than 3 years have passed since last update.

前提

gorp と go-mysql-driver を使っている。DBとマッピングする構造体に、カスタム定義の型を使いたい。

gorp https://github.com/go-gorp/gorp
go-mysql-driver https://github.com/go-sql-driver/mysql

//define my custom type
type ItemId string

// define my table
type Item struct {
    ItemId ItemId `db:"item_id"`
}

問題

gorpでクエリを打ってみると、このようなエラーが出て失敗。

error: sql: converting argument $1 type: unsupported type hoge.ItemId, a string

解決

database/sql/driver.Valuer インターフェースと、
database/sql/sql.Scanner インターフェースを実装すれば良いらしい。

実装

func (a ItemId) Value() (driver.Value, error) {
    return driver.Value(string(a)), nil
}

func (a *ItemId) Scan(value interface{}) error {
    *a = ItemId(string(value.([]uint8)))
    return nil
}

この、Value()とScan()の中身は、実際の型にあわせて、よしなに実装する。
今回は error は nil で返してしまっているが、型に適合しているかのチェックにも使えるようだ。
また、Value()とScan()はシリアライザ・デシリアライザのように使えるので、複雑な独自の構造体をDBの単一カラムに割り当てるような使い方も可能なようだ。

タイトルに gorp と入れてしまったが、特にgorpに限定した話ではない。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした