Documentation
¶
Overview ¶
sqlパッケージは、SQL(またはSQLライク)データベースを取り巻く汎用インターフェースを提供します。
sqlパッケージは、データベースドライバと共に使用する必要があります。 ドライバのリストについては、https://golang.org/s/sqldrivers を参照してください。
コンテキストのキャンセルをサポートしていないドライバは、クエリが完了するまで戻らないことに注意してください。
使用例については、https://golang.org/s/sqlwiki のウィキページを参照してください。
Example (OpenDBCLI) ¶
id := flag.Int64("id", 0, "person ID to find")
dsn := flag.String("dsn", os.Getenv("DSN"), "connection data source name")
flag.Parse()
if len(*dsn) == 0 {
log.Fatal("missing dsn flag")
}
if *id == 0 {
log.Fatal("missing person ID")
}
var err error
// ドライバを開く場合、通常、データベースへの接続は試みられません。
pool, err = sql.Open("driver-name", *dsn)
if err != nil {
// これは接続エラーではなく、DSN解析エラーや他の初期化エラーです。
log.Fatal("unable to use data source name", err)
}
defer pool.Close()
pool.SetConnMaxLifetime(0)
pool.SetMaxIdleConns(3)
pool.SetMaxOpenConns(3)
ctx, stop := context.WithCancel(context.Background())
defer stop()
appSignal := make(chan os.Signal, 3)
signal.Notify(appSignal, os.Interrupt)
go func() {
<-appSignal
stop()
}()
Ping(ctx)
Query(ctx, *id)
Example (OpenDBService) ¶
// ドライバを開くと、通常はデータベースに接続しようとは試みません。
db, err := sql.Open("driver-name", "database=test1")
if err != nil {
// これは接続エラーではなく、DSNの解析エラーや他の初期化エラーです。
log.Fatal(err)
}
db.SetConnMaxLifetime(0)
db.SetMaxIdleConns(50)
db.SetMaxOpenConns(50)
s := &Service{db: db}
http.ListenAndServe(":8080", s)
Index ¶
- Variables
- func Drivers() []string
- func Register(name string, driver driver.Driver)
- type ColumnType
- func (ci *ColumnType) DatabaseTypeName() string
- func (ci *ColumnType) DecimalSize() (precision, scale int64, ok bool)
- func (ci *ColumnType) Length() (length int64, ok bool)
- func (ci *ColumnType) Name() string
- func (ci *ColumnType) Nullable() (nullable, ok bool)
- func (ci *ColumnType) ScanType() reflect.Type
- type Conn
- func (c *Conn) BeginTx(ctx context.Context, opts *TxOptions) (*Tx, error)
- func (c *Conn) Close() error
- func (c *Conn) ExecContext(ctx context.Context, query string, args ...any) (Result, error)
- func (c *Conn) PingContext(ctx context.Context) error
- func (c *Conn) PrepareContext(ctx context.Context, query string) (*Stmt, error)
- func (c *Conn) QueryContext(ctx context.Context, query string, args ...any) (*Rows, error)
- func (c *Conn) QueryRowContext(ctx context.Context, query string, args ...any) *Row
- func (c *Conn) Raw(f func(driverConn any) error) (err error)
- type DB
- func (db *DB) Begin() (*Tx, error)
- func (db *DB) BeginTx(ctx context.Context, opts *TxOptions) (*Tx, error)
- func (db *DB) Close() error
- func (db *DB) Conn(ctx context.Context) (*Conn, error)
- func (db *DB) Driver() driver.Driver
- func (db *DB) Exec(query string, args ...any) (Result, error)
- func (db *DB) ExecContext(ctx context.Context, query string, args ...any) (Result, error)
- func (db *DB) Ping() error
- func (db *DB) PingContext(ctx context.Context) error
- func (db *DB) Prepare(query string) (*Stmt, error)
- func (db *DB) PrepareContext(ctx context.Context, query string) (*Stmt, error)
- func (db *DB) Query(query string, args ...any) (*Rows, error)
- func (db *DB) QueryContext(ctx context.Context, query string, args ...any) (*Rows, error)
- func (db *DB) QueryRow(query string, args ...any) *Row
- func (db *DB) QueryRowContext(ctx context.Context, query string, args ...any) *Row
- func (db *DB) SetConnMaxIdleTime(d time.Duration)
- func (db *DB) SetConnMaxLifetime(d time.Duration)
- func (db *DB) SetMaxIdleConns(n int)
- func (db *DB) SetMaxOpenConns(n int)
- func (db *DB) Stats() DBStats
- type DBStats
- type IsolationLevel
- type NamedArg
- type Null
- type NullBool
- type NullByte
- type NullFloat64
- type NullInt16
- type NullInt32
- type NullInt64
- type NullString
- type NullTime
- type Out
- type RawBytes
- type Result
- type Row
- type Rows
- type Scanner
- type Stmt
- func (s *Stmt) Close() error
- func (s *Stmt) Exec(args ...any) (Result, error)
- func (s *Stmt) ExecContext(ctx context.Context, args ...any) (Result, error)
- func (s *Stmt) Query(args ...any) (*Rows, error)
- func (s *Stmt) QueryContext(ctx context.Context, args ...any) (*Rows, error)
- func (s *Stmt) QueryRow(args ...any) *Row
- func (s *Stmt) QueryRowContext(ctx context.Context, args ...any) *Row
- type Tx
- func (tx *Tx) Commit() error
- func (tx *Tx) Exec(query string, args ...any) (Result, error)
- func (tx *Tx) ExecContext(ctx context.Context, query string, args ...any) (Result, error)
- func (tx *Tx) Prepare(query string) (*Stmt, error)
- func (tx *Tx) PrepareContext(ctx context.Context, query string) (*Stmt, error)
- func (tx *Tx) Query(query string, args ...any) (*Rows, error)
- func (tx *Tx) QueryContext(ctx context.Context, query string, args ...any) (*Rows, error)
- func (tx *Tx) QueryRow(query string, args ...any) *Row
- func (tx *Tx) QueryRowContext(ctx context.Context, query string, args ...any) *Row
- func (tx *Tx) Rollback() error
- func (tx *Tx) Stmt(stmt *Stmt) *Stmt
- func (tx *Tx) StmtContext(ctx context.Context, stmt *Stmt) *Stmt
- type TxOptions
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrConnDone = errors.New("sql: connection is already closed")
ErrConnDoneは、接続プールに返された接続で実行された操作によって返されます。
var ErrNoRows = errors.New("sql: no rows in result set")
ErrNoRowsは、 DB.QueryRow が行を返さない場合に Row.Scan によって返されます。 そのような場合、QueryRowはプレースホルダー *Row 値を返し、 このエラーはScanまで遅延されます。
var ErrTxDone = errors.New("sql: transaction has already been committed or rolled back")
ErrTxDoneは、すでにコミットまたはロールバックされたトランザクションに対して実行された操作によって返されます。
Functions ¶
Types ¶
type ColumnType ¶ added in v1.8.0
type ColumnType struct {
// contains filtered or unexported fields
}
ColumnTypeは、列の名前と型を含みます。
func (*ColumnType) DatabaseTypeName ¶ added in v1.8.0
func (ci *ColumnType) DatabaseTypeName() string
DatabaseTypeNameは、列のデータベースシステム名を返します。 空の文字列が返された場合、ドライバの型名はサポートされていません。 ドライバのデータ型のリストについては、ドライバのドキュメントを参照してください。 ColumnType.Length 指定子は含まれません。 一般的な型名には、"VARCHAR"、"TEXT"、"NVARCHAR"、"DECIMAL"、"BOOL"、"INT"、"BIGINT"があります。
func (*ColumnType) DecimalSize ¶ added in v1.8.0
func (ci *ColumnType) DecimalSize() (precision, scale int64, ok bool)
DecimalSizeは、10進数型のスケールと精度を返します。 適用できない場合やサポートされていない場合は、okがfalseになります。
func (*ColumnType) Length ¶ added in v1.8.0
func (ci *ColumnType) Length() (length int64, ok bool)
Lengthは、テキストやバイナリフィールドタイプなどの可変長カラムタイプのためのカラムタイプ長を返します。 タイプ長が無制限の場合、値は math.MaxInt64 になります(データベースの制限は引き続き適用されます)。 カラムタイプが可変長でない場合、例えばintの場合、またはドライバでサポートされていない場合、okはfalseになります。
func (*ColumnType) Name ¶ added in v1.8.0
func (ci *ColumnType) Name() string
Nameは、列の名前またはエイリアスを返します。
func (*ColumnType) Nullable ¶ added in v1.8.0
func (ci *ColumnType) Nullable() (nullable, ok bool)
Nullableは、列がnullである可能性があるかどうかを報告します。 ドライバがこのプロパティをサポートしていない場合、okはfalseになります。
type Conn ¶ added in v1.9.0
type Conn struct {
// contains filtered or unexported fields
}
Connは、データベース接続プールではなく、単一のデータベース接続を表します。 特定の理由がない限り、クエリは DB から実行することをお勧めします。
Connは、 Conn.Close を呼び出して接続をデータベースプールに返す必要があります。 また、実行中のクエリと同時に呼び出すことができます。
Conn.Close の呼び出し後、接続に対するすべての操作は ErrConnDone で失敗します。
func (*Conn) BeginTx ¶ added in v1.9.0
BeginTxはトランザクションを開始します。
提供されたコンテキストは、トランザクションがコミットまたはロールバックされるまで使用されます。 コンテキストがキャンセルされると、sqlパッケージはトランザクションをロールバックします。 BeginTxに提供されたコンテキストがキャンセルされた場合、 Tx.Commit はエラーを返します。
提供された TxOptions はオプションであり、デフォルトを使用する場合はnilにすることができます。 ドライバーがサポートしていない非デフォルトの分離レベルが使用された場合、エラーが返されます。
func (*Conn) Close ¶ added in v1.9.0
Closeは、接続を接続プールに返します。 Closeの後に行われたすべての操作は、 ErrConnDone で返されます。 Closeは、他の操作と同時に安全に呼び出すことができ、 すべての他の操作が完了するまでブロックされます。 使用されたコンテキストを最初にキャンセルしてから直接Closeを呼び出すことが役立つ場合があります。
func (*Conn) ExecContext ¶ added in v1.9.0
ExecContextは、行を返さないクエリを実行します。 argsは、クエリ内のプレースホルダーパラメーター用です。
Example ¶
// *DBは接続のプールです。Connを呼び出して接続を予約し、専用で使用します。
conn, err := db.Conn(ctx)
if err != nil {
log.Fatal(err)
}
defer conn.Close() // プールに接続を返す。
id := 41
result, err := conn.ExecContext(ctx, `UPDATE balances SET balance = balance + 10 WHERE user_id = ?;`, id)
if err != nil {
log.Fatal(err)
}
rows, err := result.RowsAffected()
if err != nil {
log.Fatal(err)
}
if rows != 1 {
log.Fatalf("expected single row affected, got %d rows affected", rows)
}
func (*Conn) PingContext ¶ added in v1.9.0
PingContextは、データベースへの接続がまだ有効であることを確認します。
func (*Conn) PrepareContext ¶ added in v1.9.0
PrepareContextは、後でのクエリまたは実行のためにプリペアドステートメントを作成します。 返されたステートメントから複数のクエリまたは実行を同時に実行できます。 ステートメントが不要になったら、呼び出し元はステートメントの *Stmt.Close メソッドを呼び出す必要があります。
提供されたコンテキストは、ステートメントの実行ではなく、ステートメントの準備に使用されます。
func (*Conn) QueryContext ¶ added in v1.9.0
QueryContextは、通常はSELECTで返される行を返すクエリを実行します。 argsは、クエリ内のプレースホルダーパラメーター用です。
func (*Conn) QueryRowContext ¶ added in v1.9.0
QueryRowContextは、最大1行を返すと予想されるクエリを実行します。 QueryRowContextは常にnil以外の値を返します。エラーは *Row.Scan メソッドが呼び出されるまで遅延されます。 クエリが行を選択しない場合、*Row.Scan は ErrNoRows を返します。 そうでない場合、*Row.Scan は最初に選択された行をスキャンし、残りを破棄します。
func (*Conn) Raw ¶ added in v1.13.0
Rawは、fを実行し、fの実行中に基礎となるドライバー接続を公開します。 driverConnは、fの外部で使用してはいけません。
fが返り、errが driver.ErrBadConn でない場合、 Conn は Conn.Close が呼び出されるまで使用可能です。
type DB ¶
type DB struct {
// contains filtered or unexported fields
}
DBは、ゼロ個以上の基礎接続を表すデータベースハンドルです。 複数のゴルーチンによる同時使用に対して安全です。
sqlパッケージは、接続を自動的に作成および解放します。 また、アイドル接続のフリープールを維持します。 データベースが接続ごとの状態を持つ場合、そのような状態はトランザクション(Tx)または接続(Conn)内で信頼性が高く観察できます。 DB.Begin が呼び出されると、返された Tx は単一の接続にバインドされます。 Tx.Commit または Tx.Rollback が呼び出されると、そのトランザクションの接続が DB のアイドル接続プールに返されます。 プールのサイズは DB.SetMaxIdleConns で制御できます。
func Open ¶
Openは、データベースドライバー名とドライバー固有のデータソース名で指定されたデータベースを開きます。 通常、少なくともデータベース名と接続情報が含まれます。
ほとんどのユーザーは、 *DB を返すドライバー固有の接続ヘルパー関数を介してデータベースを開きます。 Go標準ライブラリにはデータベースドライバーは含まれていません。サードパーティのドライバーのリストについては、https://golang.org/s/sqldrivers を参照してください。
Openは、データベースへの接続を作成せずに引数を検証する場合があります。 データソース名が有効であることを確認するには、DB.Ping を呼び出します。
返された DB は、複数のゴルーチンによる同時使用に対して安全であり、アイドル接続のプールを維持します。 したがって、Open関数は1回だけ呼び出す必要があります。 DB を閉じる必要はほとんどありません。
func OpenDB ¶ added in v1.10.0
OpenDBは、コネクタを使用してデータベースを開き、ドライバーが文字列ベースのデータソース名をバイパスできるようにします。
ほとんどのユーザーは、 *DB を返すドライバー固有の接続ヘルパー関数を介してデータベースを開きます。 Go標準ライブラリにはデータベースドライバーは含まれていません。サードパーティのドライバーのリストについては、https://golang.org/s/sqldrivers を参照してください。
OpenDBは、データベースへの接続を作成せずに引数を検証する場合があります。 データソース名が有効であることを確認するには、DB.Ping を呼び出します。
返された DB は、複数のゴルーチンによる同時使用に対して安全であり、アイドル接続のプールを維持します。 したがって、OpenDB関数は1回だけ呼び出す必要があります。 DB を閉じる必要はほとんどありません。
func (*DB) Begin ¶
Beginはトランザクションを開始します。デフォルトの分離レベルはドライバーに依存します。
Beginは、内部的に context.Background を使用します。コンテキストを指定するには、 DB.BeginTx を使用してください。
func (*DB) BeginTx ¶ added in v1.8.0
BeginTxはトランザクションを開始します。
提供されたコンテキストは、トランザクションがコミットまたはロールバックされるまで使用されます。 コンテキストがキャンセルされると、sqlパッケージはトランザクションをロールバックします。 BeginTxに提供されたコンテキストがキャンセルされた場合、 Tx.Commit はエラーを返します。
提供された TxOptions はオプションであり、デフォルトを使用する場合はnilにすることができます。 ドライバーがサポートしていない非デフォルトの分離レベルが使用された場合、エラーが返されます。
Example ¶
tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})
if err != nil {
log.Fatal(err)
}
id := 37
_, execErr := tx.Exec(`UPDATE users SET status = ? WHERE id = ?`, "paid", id)
if execErr != nil {
_ = tx.Rollback()
log.Fatal(execErr)
}
if err := tx.Commit(); err != nil {
log.Fatal(err)
}
func (*DB) Close ¶
Closeはデータベースを閉じ、新しいクエリの開始を防止します。 Closeは、サーバーで処理を開始したすべてのクエリが完了するのを待ってから終了します。
DB ハンドルは長期間生存し、多くのゴルーチンで共有されることを意図しているため、 DB をCloseすることはまれです。
func (*DB) Conn ¶ added in v1.9.0
Connは、新しい接続を開くか、接続プールから既存の接続を返して、単一の接続を返します。 Connは、接続が返されるか、ctxがキャンセルされるまでブロックされます。 同じConnで実行されるクエリは、同じデータベースセッションで実行されます。
各Connは、 Conn.Close を呼び出して使用後にデータベースプールに返す必要があります。
func (*DB) Exec ¶
Execは、行を返さないクエリを実行します。 argsは、クエリ内のプレースホルダーパラメーター用です。
Execは、内部的に context.Background を使用します。コンテキストを指定するには、 DB.ExecContext を使用してください。
func (*DB) ExecContext ¶ added in v1.8.0
ExecContextは、行を返さないクエリを実行します。 argsは、クエリ内のプレースホルダーパラメーター用です。
Example ¶
id := 47
result, err := db.ExecContext(ctx, "UPDATE balances SET balance = balance + 10 WHERE user_id = ?", id)
if err != nil {
log.Fatal(err)
}
rows, err := result.RowsAffected()
if err != nil {
log.Fatal(err)
}
if rows != 1 {
log.Fatalf("expected to affect 1 row, affected %d", rows)
}
func (*DB) Ping ¶ added in v1.1.0
Pingは、データベースへの接続がまだ有効であることを確認し、必要に応じて接続を確立します。
Pingは、内部的に context.Background を使用します。コンテキストを指定するには、 DB.PingContext を使用してください。
func (*DB) PingContext ¶ added in v1.8.0
PingContextは、データベースへの接続がまだ有効であることを確認し、必要に応じて接続を確立します。
Example ¶
// PingとPingContextは、データベースサーバーとの通信がまだ可能かどうかを判定するために使用されます。
//
// コマンドラインアプリケーションで使用する場合、Pingは追加クエリが可能であり、提供されたDSNが有効であることを確立するために使用できます。
//
// ロングランニングサービスで使用する場合、Pingはヘルスチェックシステムの一部となることがあります。
ctx, cancel := context.WithTimeout(ctx, 1*time.Second)
defer cancel()
status := "up"
if err := db.PingContext(ctx); err != nil {
status = "down"
}
log.Println(status)
func (*DB) Prepare ¶
Prepareは、後でのクエリまたは実行のためにプリペアドステートメントを作成します。 返されたステートメントから複数のクエリまたは実行を同時に実行できます。 ステートメントが不要になったら、呼び出し元はステートメントの *Stmt.Close メソッドを呼び出す必要があります。
Prepareは、内部的に context.Background を使用します。コンテキストを指定するには、 DB.PrepareContext を使用してください。
Example ¶
projects := []struct {
mascot string
release int
}{
{"tux", 1991},
{"duke", 1996},
{"gopher", 2009},
{"moby dock", 2013},
}
stmt, err := db.Prepare("INSERT INTO projects(id, mascot, release, category) VALUES( ?, ?, ?, ? )")
if err != nil {
log.Fatal(err)
}
defer stmt.Close() // 準備されたステートメントはサーバーリソースを消費するため、使用後は必ず閉じる必要があります。
for id, project := range projects {
if _, err := stmt.Exec(id+1, project.mascot, project.release, "open source"); err != nil {
log.Fatal(err)
}
}
func (*DB) PrepareContext ¶ added in v1.8.0
PrepareContextは、後でのクエリまたは実行のためにプリペアドステートメントを作成します。 返されたステートメントから複数のクエリまたは実行を同時に実行できます。 ステートメントが不要になったら、呼び出し元はステートメントの *Stmt.Close メソッドを呼び出す必要があります。
提供されたコンテキストは、ステートメントの実行ではなく、ステートメントの準備に使用されます。
func (*DB) Query ¶
QueryContextは、通常はSELECTで返される行を返すクエリを実行します。 argsは、クエリ内のプレースホルダーパラメーター用です。
QueryContextは、内部的に context.Background を使用します。コンテキストを指定するには、 DB.QueryContext を使用してください。
Example (MultipleResultSets) ¶
age := 27
q := `
create temp table uid (id bigint); -- Create temp table for queries.
insert into uid
select id from users where age < ?; -- Populate temp table.
-- First result set.
select
users.id, name
from
users
join uid on users.id = uid.id
;
-- Second result set.
select
ur.user, ur.role
from
user_roles as ur
join uid on uid.id = ur.user
;
`
rows, err := db.Query(q, age)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var (
id int64
name string
)
if err := rows.Scan(&id, &name); err != nil {
log.Fatal(err)
}
log.Printf("id %d name is %s\n", id, name)
}
if !rows.NextResultSet() {
log.Fatalf("expected more result sets: %v", rows.Err())
}
var roleMap = map[int64]string{
1: "user",
2: "admin",
3: "gopher",
}
for rows.Next() {
var (
id int64
role int64
)
if err := rows.Scan(&id, &role); err != nil {
log.Fatal(err)
}
log.Printf("id %d has role %s\n", id, roleMap[role])
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
func (*DB) QueryContext ¶ added in v1.8.0
QueryContextは、通常はSELECTで返される行を返すクエリを実行します。 argsは、クエリ内のプレースホルダーパラメーター用です。
Example ¶
age := 27
rows, err := db.QueryContext(ctx, "SELECT name FROM users WHERE age=?", age)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
names := make([]string, 0)
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
// スキャンエラーをチェックします。
// クエリの行はdeferで閉じられます。
log.Fatal(err)
}
names = append(names, name)
}
// データベースが書き込まれる場合は、ドライバから返されるCloseエラーを確認することを確実に行ってください。クエリは自動コミットエラーに遭遇し、変更をロールバックする必要がある場合があります。
rerr := rows.Close()
if rerr != nil {
log.Fatal(rerr)
}
// Rows.ErrはRows.Scanで遭遇した最後のエラーを報告します。
if err := rows.Err(); err != nil {
log.Fatal(err)
}
fmt.Printf("%s are %d years old", strings.Join(names, ", "), age)
func (*DB) QueryRow ¶
QueryRowは、最大1行を返すと予想されるクエリを実行します。 QueryRowは常にnil以外の値を返します。エラーは Row のScanメソッドが呼び出されるまで遅延されます。 クエリが行を選択しない場合、*Row.Scan は ErrNoRows を返します。 そうでない場合、*Row.Scan は最初に選択された行をスキャンし、残りを破棄します。
QueryRowは、内部的に context.Background を使用します。コンテキストを指定するには、 [DBQueryRowContext] を使用してください。
func (*DB) QueryRowContext ¶ added in v1.8.0
QueryRowContextは、最大1行を返すと予想されるクエリを実行します。 QueryRowContextは常にnil以外の値を返します。エラーは Row のScanメソッドが呼び出されるまで遅延されます。 クエリが行を選択しない場合、*Row.Scan は ErrNoRows を返します。 そうでない場合、*Row.Scan は最初に選択された行をスキャンし、残りを破棄します。
Example ¶
id := 123
var username string
var created time.Time
err := db.QueryRowContext(ctx, "SELECT username, created_at FROM users WHERE id=?", id).Scan(&username, &created)
switch {
case err == sql.ErrNoRows:
log.Printf("no user with id %d\n", id)
case err != nil:
log.Fatalf("query error: %v\n", err)
default:
log.Printf("username is %q, account created on %s\n", username, created)
}
func (*DB) SetConnMaxIdleTime ¶ added in v1.15.0
SetConnMaxIdleTimeは、接続がアイドル状態になっている最大時間を設定します。
期限切れの接続は再利用前に遅延して閉じることができます。
d <= 0の場合、接続のアイドル時間により接続が閉じられることはありません。
func (*DB) SetConnMaxLifetime ¶ added in v1.6.0
SetConnMaxLifetimeは、接続が再利用される最大時間を設定します。
期限切れの接続は再利用前に遅延して閉じることができます。
d <= 0の場合、接続の年齢により接続が閉じられることはありません。
func (*DB) SetMaxIdleConns ¶ added in v1.1.0
SetMaxIdleConnsは、アイドル接続プール内の最大接続数を設定します。
MaxOpenConnsが0より大きく、新しいMaxIdleConnsより小さい場合、 新しいMaxIdleConnsはMaxOpenConnsの制限に合わせて減少します。
n <= 0の場合、アイドル接続は保持されません。
デフォルトの最大アイドル接続数は現在2です。将来のリリースで変更される可能性があります。
func (*DB) SetMaxOpenConns ¶ added in v1.2.0
SetMaxOpenConnsは、データベースへの最大オープン接続数を設定します。
MaxIdleConnsが0より大きく、新しいMaxOpenConnsより小さい場合、 新しいMaxIdleConnsはMaxOpenConnsの制限に合わせて減少します。
n <= 0の場合、オープン接続数に制限はありません。 デフォルトは0(無制限)です。
type DBStats ¶ added in v1.5.0
type DBStats struct {
MaxOpenConnections int
// Pool Status
OpenConnections int
InUse int
Idle int
// Counters
WaitCount int64
WaitDuration time.Duration
MaxIdleClosed int64
MaxIdleTimeClosed int64
MaxLifetimeClosed int64
}
DBStatsには、データベースの統計情報が含まれます。
type IsolationLevel ¶ added in v1.8.0
type IsolationLevel int
IsolationLevelは、 TxOptions で使用されるトランザクション分離レベルです。
const ( LevelDefault IsolationLevel = iota LevelReadUncommitted LevelReadCommitted LevelWriteCommitted LevelRepeatableRead LevelSnapshot LevelSerializable LevelLinearizable )
DB.BeginTx でドライバーがサポートする可能性のあるさまざまな分離レベル。 ドライバーが特定の分離レベルをサポートしていない場合、エラーが返される場合があります。
https://en.wikipedia.org/wiki/Isolation_(database_systems)#Isolation_levels を参照してください。
func (IsolationLevel) String ¶ added in v1.11.0
func (i IsolationLevel) String() string
Stringはトランザクション分離レベルの名前を返します。
type NamedArg ¶ added in v1.8.0
type NamedArg struct {
// Nameはパラメータプレースホルダーの名前です。
//
// 空の場合、引数リストの序数が使用されます。
//
// Nameには、シンボル接頭辞を省略する必要があります。
Name string
// Valueはパラメータの値です。
// クエリ引数と同じ値型が割り当てられる可能性があります。
Value any
// contains filtered or unexported fields
}
NamedArgは名前付き引数です。NamedArg値は、 DB.Query または DB.Exec の引数として使用でき、 SQLステートメントの対応する名前付きパラメータにバインドされます。
NamedArg値をより簡潔に作成する方法については、 Named 関数を参照してください。
type Null ¶ added in v1.22.0
Nullは、nullである可能性がある値を表します。 Nullは Scanner インターフェースを実装するため、 スキャン先として使用できます。
var s Null[string]
err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s)
...
if s.Valid {
// use s.V
} else {
// NULL value
}
T should be one of the types accepted by driver.Value.
type NullBool ¶
NullBoolは、nullである可能性があるboolを表します。 NullBoolは Scanner インターフェースを実装するため、 NullString と同様にスキャン先として使用できます。
type NullByte ¶ added in v1.17.0
NullByteは、nullである可能性があるバイトを表します。 NullByteは Scanner インターフェースを実装するため、 NullString と同様にスキャン先として使用できます。
type NullFloat64 ¶
NullFloat64は、nullである可能性があるfloat64を表します。 NullFloat64は Scanner インターフェースを実装するため、 NullString と同様にスキャン先として使用できます。
func (*NullFloat64) Scan ¶
func (n *NullFloat64) Scan(value any) error
Scanは Scanner インターフェースを実装します。
func (NullFloat64) Value ¶
func (n NullFloat64) Value() (driver.Value, error)
Valueは、 driver.Valuer インターフェースを実装します。
type NullInt16 ¶ added in v1.17.0
NullInt16は、nullである可能性があるint16を表します。 NullInt16は Scanner インターフェースを実装するため、 NullString と同様にスキャン先として使用できます。
type NullInt32 ¶ added in v1.13.0
NullInt32は、nullである可能性があるint32を表します。 NullInt32は Scanner インターフェースを実装するため、 NullStringと同様にスキャン先として使用できます。
type NullInt64 ¶
NullInt64は、nullである可能性があるint64を表します。 NullInt64はScannerインターフェースを実装するため、 NullString と同様にスキャン先として使用できます。
type NullString ¶
NullStringは、nullである可能性がある文字列を表します。 NullStringは Scanner インターフェースを実装するため、 スキャン先として使用できます。
var s NullString
err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s)
...
if s.Valid {
// use s.String
} else {
// NULL value
}
func (NullString) Value ¶
func (ns NullString) Value() (driver.Value, error)
Valueは、 driver.Valuer インターフェースを実装します。
type NullTime ¶ added in v1.13.0
NullTimeは、nullである可能性がある time.Time を表します。 NullTimeは Scanner インターフェースを実装するため、 NullString と同様にスキャン先として使用できます。
type Out ¶ added in v1.9.0
type Out struct {
// Destは、ストアドプロシージャのOUTPUTパラメータの結果に設定される値へのポインタです。
Dest any
// Inは、パラメータがINOUTパラメータであるかどうかを示します。
// その場合、ストアドプロシージャへの入力値はDestのポインタの参照解除された値であり、
// その後、出力値で置き換えられます。
In bool
// contains filtered or unexported fields
}
Outは、ストアドプロシージャからOUTPUT値パラメータを取得するために使用できます。
すべてのドライバーとデータベースがOUTPUT値パラメータをサポートしているわけではありません。
使用例:
var outArg string
_, err := db.ExecContext(ctx, "ProcName", sql.Named("Arg1", sql.Out{Dest: &outArg}))
type RawBytes ¶
type RawBytes []byte
RawBytesは、データベース自体が所有するメモリへの参照を保持するバイトスライスです。 RawBytesに対して Rows.Scan を実行した後、スライスは次の Rows.Next、Rows.Scan、または Rows.Close の呼び出しまでのみ有効です。
type Row ¶
type Row struct {
// contains filtered or unexported fields
}
Rowは、単一の行を選択するために DB.QueryRow を呼び出した結果です。
type Rows ¶
type Rows struct {
// contains filtered or unexported fields
}
Rowsはクエリの結果です。そのカーソルは、結果セットの最初の行の前に開始します。 行から行に進むには、 Rows.Next を使用してください。
Example ¶
age := 27
rows, err := db.QueryContext(ctx, "SELECT name FROM users WHERE age=?", age)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
names := make([]string, 0)
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
log.Fatal(err)
}
names = append(names, name)
}
// 行を反復してエラーをチェックします。
if err := rows.Err(); err != nil {
log.Fatal(err)
}
log.Printf("%s are %d years old", strings.Join(names, ", "), age)
func (*Rows) Close ¶
Closeは、 Rows を閉じ、以降の列挙を防止します。 Rows.Next がfalseを返し、さらに結果セットがない場合、 Rows は自動的に閉じられ、 Rows.Err の結果を確認するだけで十分です。 Closeは冪等性があり、 Rows.Err の結果に影響を与えません。
func (*Rows) ColumnTypes ¶ added in v1.8.0
func (rs *Rows) ColumnTypes() ([]*ColumnType, error)
ColumnTypesは、列の型、長さ、null可能性などの列情報を返します。 一部の情報は、一部のドライバから利用できない場合があります。
func (*Rows) Err ¶
Errは、反復中に遭遇したエラー(ある場合)を返します。 明示的または暗黙的な Rows.Close の後にErrを呼び出すことができます。
func (*Rows) Next ¶
Nextは、 Rows.Scan メソッドで読み取る次の結果行を準備します。 成功した場合はtrue、次の結果行がない場合や準備中にエラーが発生した場合はfalseを返します。 2つの場合を区別するには、 Rows.Err を参照する必要があります。
最初の呼び出しを含め、すべての Rows.Scan 呼び出しは、 Rows.Next の呼び出しに先立っている必要があります。
func (*Rows) NextResultSet ¶ added in v1.8.0
NextResultSetは、次の結果セットの読み取りの準備をします。 さらに結果セットがある場合はtrue、それ以外の場合はfalseを報告します。 または、それに進む際にエラーが発生した場合はfalseを報告します。 2つの場合を区別するには、 Rows.Err を参照する必要があります。
NextResultSetを呼び出した後、スキャンする前に常に Rows.Next メソッドを呼び出す必要があります。 さらに結果セットがある場合、結果セットに行がない場合があります。
func (*Rows) Scan ¶
Scanは、現在の行の列をdestが指す値にコピーします。 destの数は Rows の列数と同じでなければなりません。
Scanは、データベースから読み取った列を、以下の共通のGoの型およびsqlパッケージで提供される特殊な型に変換します。
*string
*[]byte
*int, *int8, *int16, *int32, *int64
*uint, *uint8, *uint16, *uint32, *uint64
*bool
*float32, *float64
*interface{}
*RawBytes
*Rows (カーソル値)
Scanner を実装する任意の型(Scannerドキュメントを参照)
最も単純な場合、ソース列の値の型が整数、ブール、または文字列型Tで、destが型*Tの場合、Scanは単にポインタを介して値を割り当てます。
Scanは、文字列と数値型の間でも変換しますが、情報が失われない場合に限ります。Scanは、数値データベース列からスキャンされたすべての数値を*stringに文字列化しますが、数値型へのスキャンはオーバーフローのチェックが行われます。例えば、値が300のfloat64または値が"300"の文字列はuint16にスキャンできますが、uint8にはスキャンできません。ただし、float64(255)または"255"はuint8にスキャンできます。一部のfloat64数値を文字列に変換するスキャンは、文字列化すると情報が失われる場合があります。一般的には、浮動小数点列を*float64にスキャンします。
dest引数の型が*[]byteの場合、Scanは対応するデータのコピーをその引数に保存します。コピーは呼び出し元が所有し、修正して無期限に保持できます。コピーを回避するには、代わりに *RawBytes の引数を使用します。RawBytes の使用制限については、 RawBytes のドキュメントを参照してください。
引数の型が*interface{}の場合、Scanは変換せずに基礎ドライバが提供する値をコピーします。[]byte型のソース値から*interface{}にスキャンする場合、スライスのコピーが作成され、呼び出し元が結果を所有します。
time.Time 型のソース値は、*time.Time、*interface{}、*string、または*[]byte型の値にスキャンできます。後者2つに変換する場合、time.RFC3339Nano が使用されます。
bool型のソース値は、*bool、*interface{}、*string、*[]byte、または *RawBytes 型にスキャンできます。
*boolにスキャンする場合、ソースはtrue、false、1、0、または strconv.ParseBool で解析可能な文字列入力である必要があります。
Scanは、クエリから返されたカーソル(例:"select cursor(select * from my_table) from dual")を、自体からスキャンできる *Rows 値に変換できます。親の *Rows が閉じられると、親の選択クエリはカーソル *Rows を閉じます。
最初の引数のいずれかがエラーを返す Scanner を実装している場合、そのエラーは返されたエラーにラップされます。
type Stmt ¶
type Stmt struct {
// contains filtered or unexported fields
}
Stmtは、プリペアドステートメントです。 Stmtは、複数のゴルーチンによる同時使用に対して安全です。
Stmtが Tx または Conn で準備された場合、それは1つの基礎となる接続に永久にバインドされます。 Tx または Conn が閉じられると、Stmtは使用できなくなり、すべての操作がエラーを返します。 Stmtが DB で準備された場合、それは DB の寿命の間使用可能です。 Stmtが新しい基礎となる接続で実行する必要がある場合、自動的に新しい接続で自己準備します。
Example ¶
// 通常使用時には、プロセスの開始時に1つのStmtを作成します。
stmt, err := db.PrepareContext(ctx, "SELECT username FROM users WHERE id = ?")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
// クエリを発行する必要があるたびに再利用してください。
id := 43
var username string
err = stmt.QueryRowContext(ctx, id).Scan(&username)
switch {
case err == sql.ErrNoRows:
log.Fatalf("no user with id %d", id)
case err != nil:
log.Fatal(err)
default:
log.Printf("username is %s\n", username)
}
func (*Stmt) Exec ¶
Execは、指定された引数を使用してプリペアドステートメントを実行し、 ステートメントの影響を要約する Result を返します。
Execは、内部的に context.Background を使用します。コンテキストを指定するには、 Stmt.ExecContext を使用してください。
func (*Stmt) ExecContext ¶ added in v1.8.0
ExecContextは、指定された引数を使用してプリペアドステートメントを実行し、 ステートメントの影響を要約する Result を返します。
func (*Stmt) Query ¶
Queryは、指定された引数を使用してプリペアドクエリステートメントを実行し、 クエリ結果を*Rowsとして返します。
Queryは、内部的に context.Background を使用します。コンテキストを指定するには、 Stmt.QueryContext を使用してください。
func (*Stmt) QueryContext ¶ added in v1.8.0
QueryContextは、指定された引数を使用してプリペアドクエリステートメントを実行し、 クエリ結果を *Rows として返します。
func (*Stmt) QueryRow ¶
QueryRowは、指定された引数を使用してプリペアドクエリステートメントを実行し、 ステートメントの実行中にエラーが発生した場合、そのエラーは常にnil以外の *Row のScan呼び出しによって返されます。 クエリが行を選択しない場合、*Row.Scan は ErrNoRows を返します。 そうでない場合、*Row.Scan のScanは最初に選択された行をスキャンし、残りを破棄します。
使用例:
var name string err := nameByUseridStmt.QueryRow(id).Scan(&name)
QueryRowは、内部的に context.Background を使用します。コンテキストを指定するには、 Stmt.QueryRowContext を使用してください。
func (*Stmt) QueryRowContext ¶ added in v1.8.0
QueryRowContextは、指定された引数を使用してプリペアドクエリステートメントを実行し、 ステートメントの実行中にエラーが発生した場合、そのエラーは常にnil以外の *Row のScan呼び出しによって返されます。 クエリが行を選択しない場合、*Row.Scan は ErrNoRows を返します。 そうでない場合、*Row.Scan は最初に選択された行をスキャンし、残りを破棄します。
Example ¶
// 通常の使用では、プロセス開始時に1つのStmtを作成します。
stmt, err := db.PrepareContext(ctx, "SELECT username FROM users WHERE id = ?")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
// クエリを発行するたびに再利用してください。
id := 43
var username string
err = stmt.QueryRowContext(ctx, id).Scan(&username)
switch {
case err == sql.ErrNoRows:
log.Fatalf("no user with id %d", id)
case err != nil:
log.Fatal(err)
default:
log.Printf("username is %s\n", username)
}
type Tx ¶
type Tx struct {
// contains filtered or unexported fields
}
Txは、進行中のデータベーストランザクションです。
トランザクションは、 Tx.Commit または Tx.Rollback の呼び出しで終了する必要があります。
Tx.Commit または Tx.Rollback の呼び出し後、トランザクション上のすべての操作は ErrTxDone で失敗します。
トランザクションの Tx.Prepare または Tx.Stmt メソッドを呼び出して準備されたステートメントは、 Tx.Commit または Tx.Rollback の呼び出しで閉じられます。
func (*Tx) Exec ¶
Execは、行を返さないクエリを実行します。 例えば、INSERTやUPDATEです。
Execは、内部的に context.Background を使用します。コンテキストを指定するには、 Tx.ExecContext を使用してください。
func (*Tx) ExecContext ¶ added in v1.8.0
ExecContextは、行を返さないクエリを実行します。 例えば、INSERTやUPDATEです。
Example ¶
tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})
if err != nil {
log.Fatal(err)
}
id := 37
_, execErr := tx.ExecContext(ctx, "UPDATE users SET status = ? WHERE id = ?", "paid", id)
if execErr != nil {
if rollbackErr := tx.Rollback(); rollbackErr != nil {
log.Fatalf("update failed: %v, unable to rollback: %v\n", execErr, rollbackErr)
}
log.Fatalf("update failed: %v", execErr)
}
if err := tx.Commit(); err != nil {
log.Fatal(err)
}
func (*Tx) Prepare ¶
Prepareは、トランザクション内で使用するためのプリペアドステートメントを作成します。
返されたステートメントはトランザクション内で動作し、トランザクションがコミットまたはロールバックされたときに閉じられます。
このトランザクションで既存のプリペアドステートメントを使用するには、 Tx.Stmt を参照してください。
Prepareは、内部的に context.Background を使用します。コンテキストを指定するには、 Tx.PrepareContext を使用してください。
Example ¶
projects := []struct {
mascot string
release int
}{
{"tux", 1991},
{"duke", 1996},
{"gopher", 2009},
{"moby dock", 2013},
}
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
defer tx.Rollback() // もし関数内で後でトランザクションがコミットされた場合は、ロールバックは無視されます。
stmt, err := tx.Prepare("INSERT INTO projects(id, mascot, release, category) VALUES( ?, ?, ?, ? )")
if err != nil {
log.Fatal(err)
}
defer stmt.Close() // プリペアドステートメントはサーバーのリソースを使用するため、使用後は閉じるべきです。
for id, project := range projects {
if _, err := stmt.Exec(id+1, project.mascot, project.release, "open source"); err != nil {
log.Fatal(err)
}
}
if err := tx.Commit(); err != nil {
log.Fatal(err)
}
func (*Tx) PrepareContext ¶ added in v1.8.0
PrepareContextは、トランザクション内で使用するためのプリペアドステートメントを作成します。
返されたステートメントはトランザクション内で動作し、トランザクションがコミットまたはロールバックされたときに閉じられます。
このトランザクションで既存のプリペアドステートメントを使用するには、 Tx.Stmt を参照してください。
提供されたコンテキストは、ステートメントの実行ではなく、ステートメントの準備に使用されます。 返されたステートメントはトランザクションコンテキストで実行されます。
func (*Tx) Query ¶
Queryは、通常はSELECTで返される行を返すクエリを実行します。
Queryは、内部的に context.Background を使用します。コンテキストを指定するには、 Tx.QueryContext を使用してください。
func (*Tx) QueryContext ¶ added in v1.8.0
QueryContext executes a query that returns rows, typically a SELECT.
func (*Tx) QueryRow ¶
QueryRowは、最大1行を返すと予想されるクエリを実行します。 QueryRowは常にnil以外の値を返します。エラーは Row のScanメソッドが呼び出されるまで遅延されます。 クエリが行を選択しない場合、*Row.Scan は ErrNoRows を返します。 そうでない場合、*Row.Scan は最初に選択された行をスキャンし、残りを破棄します。
QueryRowは、内部的に context.Background を使用します。コンテキストを指定するには、 Tx.QueryRowContext を使用してください。
func (*Tx) QueryRowContext ¶ added in v1.8.0
QueryRowContextは、最大1行を返すと予想されるクエリを実行します。 QueryRowContextは常にnil以外の値を返します。エラーは Row のScanメソッドが呼び出されるまで遅延されます。 クエリが行を選択しない場合、*Row.Scan は ErrNoRows を返します。 そうでない場合、*Row.Scan は最初に選択された行をスキャンし、残りを破棄します。
func (*Tx) Rollback ¶
Rollbackはトランザクションを中止します。
Example ¶
tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})
if err != nil {
log.Fatal(err)
}
id := 53
_, err = tx.ExecContext(ctx, "UPDATE drivers SET status = ? WHERE id = ?;", "assigned", id)
if err != nil {
if rollbackErr := tx.Rollback(); rollbackErr != nil {
log.Fatalf("update drivers: unable to rollback: %v", rollbackErr)
}
log.Fatal(err)
}
_, err = tx.ExecContext(ctx, "UPDATE pickups SET driver_id = $1;", id)
if err != nil {
if rollbackErr := tx.Rollback(); rollbackErr != nil {
log.Fatalf("update failed: %v, unable to back: %v", err, rollbackErr)
}
log.Fatal(err)
}
if err := tx.Commit(); err != nil {
log.Fatal(err)
}
func (*Tx) Stmt ¶
Stmtは、既存のステートメントからトランザクション固有のプリペアドステートメントを返します。
例:
updateMoney, err := db.Prepare("UPDATE balance SET money=money+? WHERE id=?")
...
tx, err := db.Begin()
...
res, err := tx.Stmt(updateMoney).Exec(123.45, 98293203)
返されたステートメントはトランザクション内で動作し、トランザクションがコミットまたはロールバックされたときに閉じられます。
Stmtは、内部的に context.Background を使用します。コンテキストを指定するには、 Tx.StmtContext を使用してください。
func (*Tx) StmtContext ¶ added in v1.8.0
StmtContextは、既存のステートメントからトランザクション固有のプリペアドステートメントを返します。
例:
updateMoney, err := db.Prepare("UPDATE balance SET money=money+? WHERE id=?")
...
tx, err := db.Begin()
...
res, err := tx.StmtContext(ctx, updateMoney).Exec(123.45, 98293203)
提供されたコンテキストはステートメントの実行ではなく、ステートメントの準備に使用されます。
返されたステートメントはトランザクション内で動作し、トランザクションがコミットまたはロールバックされたときに閉じられます。
type TxOptions ¶ added in v1.8.0
type TxOptions struct {
// Isolationはトランザクション分離レベルです。
// ゼロの場合、ドライバーまたはデータベースのデフォルトレベルが使用されます。
Isolation IsolationLevel
ReadOnly bool
}
TxOptionsは、 DB.BeginTx で使用されるトランザクションオプションを保持します。