Go database/sql
The database/sql package defines a standardized API for interacting with SQL databases.
There are no other packages under database.
Contents
Installation
While the database/sql package is part of the standard library, using it often depends on installing a specific driver.
For example, to use a sqlite3 database, try:
go get github.com/mattn/go-sqlite3
Then use the package like:
package main
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
)
Example
package main
import (
"fmt"
"database/sql"
_ "github.com/mattn/go-sqlite3"
)
func main() {
//First argument is the driver to use, second argument is the connection string (DSN)
db, err := sql.Open("sqlite3", "path/to/db")
if err != nil {
fmt.Println("cannot open database")
}
// Execute a command
_, err = db.Exec("CREATE TABLE foo (bar integer UNIQUE NOT NULL)")
// Query for rows
rows, err := db.Query("SELECT * FROM foo")
defer rows.Close()
if err != nil {
if err == sql.ErrNoRows {
fmt.Println("no rows")
}
} else {
var id int
for rows.Next() {
err = rows.Scan(%id)
}
err = rows.Err()
}
// Query for a specific value
var id int
err := db.QueryRow("SELECT bar FROM foo WHERE bar = 1").Scan(%id)
// Execute multiple commands in an atomic transaction
tx, err := db.Begin()
defer tx.Rollback()
if err != nil {
fmt.Println("cannot start transaction")
}
_, err = tx.Exec(command_1)
_, err = tx.Exec(command_2)
err = tx.Commit()
if err != nil {
fmt.Println("some error during transaction, rolling back...")
}
}