# go-sqlite3 で json1 extension が no such function と言われる時

# 現象

以下のような SQL を実行すると

func dbSQLiteRestoreFromFireBase() (err error) {
	defer erapse.ShowErapsedTIme(time.Now())

	_, err = dbSQLiteptr.Exec(`CREATE TABLE IF NOT EXISTS hyphas (
		id				VARCHAR(5) PRIMARY KEY,
		services,	JSON,
		attr			JSON,
		CHECK (JSON_VALID(services)),
		CHECK (JSON_VALID(attr))
		) WITHOUT ROWID`)

	return
}

no such function といわれてしまいました

no such function: JSON_VALID

# 結論

#cgo CFLAGS: -DSQLITE_ENABLE_JSON1 を sqlite3.go に追加して go-sqlite3 をリビルドします

# ステップ

# 1. sqlite3.go を編集

~/go/src/github.com/mattn/go-sqlite3/sqlite3.go を開いて #cgo CFLAGS: -DSQLITE_ENABLE_JSON1 を追加します
























 

// Copyright (C) 2019 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
//
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file.

// +build cgo

package sqlite3

/*
#cgo CFLAGS: -std=gnu99
#cgo CFLAGS: -DSQLITE_ENABLE_RTREE
#cgo CFLAGS: -DSQLITE_THREADSAFE=1
#cgo CFLAGS: -DHAVE_USLEEP=1
#cgo CFLAGS: -DSQLITE_ENABLE_FTS3
#cgo CFLAGS: -DSQLITE_ENABLE_FTS3_PARENTHESIS
#cgo CFLAGS: -DSQLITE_ENABLE_FTS4_UNICODE61
#cgo CFLAGS: -DSQLITE_TRACE_SIZE_LIMIT=15
#cgo CFLAGS: -DSQLITE_OMIT_DEPRECATED
#cgo CFLAGS: -DSQLITE_DISABLE_INTRINSIC
#cgo CFLAGS: -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1
#cgo CFLAGS: -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT
#cgo CFLAGS: -DSQLITE_ENABLE_JSON1

# 2.build

go build github.com/mattn/go-sqlite3

# 3. install

go install github.com/mattn/go-sqlite3

# go module を使っている場合 (2021.03.09 追記)

go module を使っている場合は、~/go/pkg/mod/github.com/mattn/go-sqlite3@(バージョン) の sqlite3.go を修正します
特に build 等しなくても初回使用時に自動的にビルドされるみたいです

# references


Last Updated: 2022/8/21 4:09:08