Documentation ¶
Overview ¶
Package driver registers a QL sql/driver named "ql" and a memory driver named "ql-mem".
See also [0], [1] and [3].
Usage ¶
A skeleton program using ql/driver.
package main import ( "database/sql" _ "github.com/cznic/ql/driver" ) func main() { ... // Disk file DB db, err := sql.Open("ql", "ql.db") // [2] // alternatively db, err := sql.Open("ql", "file://ql.db") // and/or // RAM DB mdb, err := sql.Open("ql-mem", "mem.db") // alternatively mdb, err := sql.Open("ql", "memory://mem.db") if err != nil { log.Fatal(err) } // Use db/mdb here ... }
This package exports nothing.
Example (TestFile) ¶
dir, err := ioutil.TempDir("", "ql-driver-test") if err != nil { return } defer func() { os.RemoveAll(dir) }() db, err := sql.Open("ql", filepath.Join(dir, "ql.db")) if err != nil { return } defer func() { if err := db.Close(); err != nil { return } fmt.Println("OK") }() tx, err := db.Begin() if err != nil { return } if _, err := tx.Exec("CREATE TABLE t (Qty int, Name string);"); err != nil { return } result, err := tx.Exec(` INSERT INTO t VALUES ($1, $2), ($3, $4), ; `, 42, "foo", 314, "bar", ) if err != nil { return } if err = tx.Commit(); err != nil { return } id, err := result.LastInsertId() if err != nil { return } aff, err := result.RowsAffected() if err != nil { return } fmt.Printf("LastInsertId %d, RowsAffected %d\n", id, aff) rows, err := db.Query("SELECT * FROM t;") if err != nil { return } cols, err := rows.Columns() if err != nil { return } fmt.Printf("Columns: %v\n", cols) var data struct { Qty int Name string } for rows.Next() { if err = rows.Scan(&data.Qty, &data.Name); err != nil { rows.Close() break } fmt.Printf("%+v\n", data) } if err = rows.Err(); err != nil { return }
Output: LastInsertId 2, RowsAffected 2 Columns: [Qty Name] {Qty:314 Name:bar} {Qty:42 Name:foo} OK
Example (TestMem) ¶
db, err := sql.Open("ql-mem", "mem.db") if err != nil { return } defer func() { if err := db.Close(); err != nil { return } fmt.Println("OK") }() tx, err := db.Begin() if err != nil { return } if _, err := tx.Exec("CREATE TABLE t (Qty int, Name string);"); err != nil { return } result, err := tx.Exec(` INSERT INTO t VALUES ($1, $2), ($3, $4), ; `, 1042, "foo-mem", 1314, "bar-mem", ) if err != nil { return } if err = tx.Commit(); err != nil { return } id, err := result.LastInsertId() if err != nil { return } aff, err := result.RowsAffected() if err != nil { return } fmt.Printf("LastInsertId %d, RowsAffected %d\n", id, aff) rows, err := db.Query("SELECT * FROM t;") if err != nil { return } cols, err := rows.Columns() if err != nil { return } fmt.Printf("Columns: %v\n", cols) var data struct { Qty int Name string } for rows.Next() { if err = rows.Scan(&data.Qty, &data.Name); err != nil { rows.Close() break } fmt.Printf("%+v\n", data) } if err = rows.Err(); err != nil { return }
Output: LastInsertId 2, RowsAffected 2 Columns: [Qty Name] {Qty:1314 Name:bar-mem} {Qty:1042 Name:foo-mem} OK
Click to show internal directories.
Click to hide internal directories.