README
¶
Go Relational Persistence
I hesitate to call gorp an ORM. Go doesn't really have objects, at least not in the classic Smalltalk/Java sense. There goes the "O". gorp doesn't know anything about the relationships between your structs (at least not yet). So the "R" is questionable too (but I use it in the name because, well, it seemed more clever).
The "M" is alive and well. Given some Go structs and a database, gorp should remove a fair amount of boilerplate busy-work from your code.
I hope that gorp saves you time, minimizes the drudgery of getting data in and out of your database, and helps your code focus on algorithms, not infrastructure.
- Bind struct fields to table columns via API or tag
- Support for embedded structs
- Support for transactions
- Forward engineer db schema from structs (great for unit tests)
- Pre/post insert/update/delete hooks
- Automatically generate insert/update/delete statements for a struct
- Automatic binding of auto increment PKs back to struct after insert
- Delete by primary key(s)
- Select by primary key(s)
- Optional trace sql logging
- Bind arbitrary SQL queries to a struct
- Bind slice to SELECT query results without type assertions
- Use positional or named bind parameters in custom SELECT queries
- Optional optimistic locking using a version column (for update/deletes)
Installation
# install the library:
go get github.com/coopernurse/gorp
// use in your .go code:
import (
"github.com/coopernurse/gorp"
)
API Documentation
Full godoc output from the latest code in master is available here:
http://godoc.org/github.com/coopernurse/gorp
Quickstart
package main
import (
"database/sql"
"github.com/coopernurse/gorp"
_ "github.com/mattn/go-sqlite3"
"log"
"time"
)
func main() {
// initialize the DbMap
dbmap := initDb()
defer dbmap.Db.Close()
// delete any existing rows
err := dbmap.TruncateTables()
checkErr(err, "TruncateTables failed")
// create two posts
p1 := newPost("Go 1.1 released!", "Lorem ipsum lorem ipsum")
p2 := newPost("Go 1.2 released!", "Lorem ipsum lorem ipsum")
// insert rows - auto increment PKs will be set properly after the insert
err = dbmap.Insert(&p1, &p2)
checkErr(err, "Insert failed")
// use convenience SelectInt
count, err := dbmap.SelectInt("select count(*) from posts")
checkErr(err, "select count(*) failed")
log.Println("Rows after inserting:", count)
// update a row
p2.Title = "Go 1.2 is better than ever"
count, err = dbmap.Update(&p2)
checkErr(err, "Update failed")
log.Println("Rows updated:", count)
// fetch one row - note use of "post_id" instead of "Id" since column is aliased
//
// Postgres users should use $1 instead of ? placeholders
// See 'Known Issues' below
//
err = dbmap.SelectOne(&p2, "select * from posts where post_id=?", p2.Id)
checkErr(err, "SelectOne failed")
log.Println("p2 row:", p2)
// fetch all rows
var posts []Post
_, err = dbmap.Select(&posts, "select * from posts order by post_id")
checkErr(err, "Select failed")
log.Println("All rows:")
for x, p := range posts {
log.Printf(" %d: %v\n", x, p)
}
// delete row by PK
count, err = dbmap.Delete(&p1)
checkErr(err, "Delete failed")
log.Println("Rows deleted:", count)
// delete row manually via Exec
_, err = dbmap.Exec("delete from posts where post_id=?", p2.Id)
checkErr(err, "Exec failed")
// confirm count is zero
count, err = dbmap.SelectInt("select count(*) from posts")
checkErr(err, "select count(*) failed")
log.Println("Row count - should be zero:", count)
log.Println("Done!")
}
type Post struct {
// db tag lets you specify the column name if it differs from the struct field
Id int64 `db:"post_id"`
Created int64
Title string
Body string
}
func newPost(title, body string) Post {
return Post{
Created: time.Now().UnixNano(),
Title: title,
Body: body,
}
}
func initDb() *gorp.DbMap {
// connect to db using standard Go database/sql API
// use whatever database/sql driver you wish
db, err := sql.Open("sqlite3", "/tmp/post_db.bin")
checkErr(err, "sql.Open failed")
// construct a gorp DbMap
dbmap := &gorp.DbMap{Db: db, Dialect: gorp.SqliteDialect{}}
// add a table, setting the table name to 'posts' and
// specifying that the Id property is an auto incrementing PK
dbmap.AddTableWithName(Post{}, "posts").SetKeys(true, "Id")
// create the table. in a production system you'd generally
// use a migration tool, or create the tables via scripts
err = dbmap.CreateTablesIfNotExists()
checkErr(err, "Create tables failed")
return dbmap
}
func checkErr(err error, msg string) {
if err != nil {
log.Fatalln(msg, err)
}
}
Examples
Mapping structs to tables
First define some types:
type Invoice struct {
Id int64
Created int64
Updated int64
Memo string
PersonId int64
}
type Person struct {
Id int64
Created int64
Updated int64
FName string
LName string
}
// Example of using tags to alias fields to column names
// The 'db' value is the column name
//
// A hyphen will cause gorp to skip this field, similar to the
// Go json package.
//
// This is equivalent to using the ColMap methods:
//
// table := dbmap.AddTableWithName(Product{}, "product")
// table.ColMap("Id").Rename("product_id")
// table.ColMap("Price").Rename("unit_price")
// table.ColMap("IgnoreMe").SetTransient(true)
//
type Product struct {
Id int64 `db:"product_id"`
Price int64 `db:"unit_price"`
IgnoreMe string `db:"-"`
}
Then create a mapper, typically you'd do this one time at app startup:
// connect to db using standard Go database/sql API
// use whatever database/sql driver you wish
db, err := sql.Open("mymysql", "tcp:localhost:3306*mydb/myuser/mypassword")
// construct a gorp DbMap
dbmap := &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}
// register the structs you wish to use with gorp
// you can also use the shorter dbmap.AddTable() if you
// don't want to override the table name
//
// SetKeys(true) means we have a auto increment primary key, which
// will get automatically bound to your struct post-insert
//
t1 := dbmap.AddTableWithName(Invoice{}, "invoice_test").SetKeys(true, "Id")
t2 := dbmap.AddTableWithName(Person{}, "person_test").SetKeys(true, "Id")
t3 := dbmap.AddTableWithName(Product{}, "product_test").SetKeys(true, "Id")
Struct Embedding
gorp supports embedding structs. For example:
type Names struct {
FirstName string
LastName string
}
type WithEmbeddedStruct struct {
Id int64
Names
}
es := &WithEmbeddedStruct{-1, Names{FirstName: "Alice", LastName: "Smith"}}
err := dbmap.Insert(es)
See the TestWithEmbeddedStruct
function in gorp_test.go
for a full example.
Create/Drop Tables
Automatically create / drop registered tables. This is useful for unit tests but is entirely optional. You can of course use gorp with tables created manually, or with a separate migration tool (like goose: https://bitbucket.org/liamstask/goose).
// create all registered tables
dbmap.CreateTables()
// same as above, but uses "if not exists" clause to skip tables that are
// already defined
dbmap.CreateTablesIfNotExists()
// drop
dbmap.DropTables()
SQL Logging
Optionally you can pass in a logger to trace all SQL statements. I recommend enabling this initially while you're getting the feel for what gorp is doing on your behalf.
Gorp defines a GorpLogger
interface that Go's built in log.Logger
satisfies.
However, you can write your own GorpLogger
implementation, or use a package such
as glog
if you want more control over how statements are logged.
// Will log all SQL statements + args as they are run
// The first arg is a string prefix to prepend to all log messages
dbmap.TraceOn("[gorp]", log.New(os.Stdout, "myapp:", log.Lmicroseconds))
// Turn off tracing
dbmap.TraceOff()
Insert
// Must declare as pointers so optional callback hooks
// can operate on your data, not copies
inv1 := &Invoice{0, 100, 200, "first order", 0}
inv2 := &Invoice{0, 100, 200, "second order", 0}
// Insert your rows
err := dbmap.Insert(inv1, inv2)
// Because we called SetKeys(true) on Invoice, the Id field
// will be populated after the Insert() automatically
fmt.Printf("inv1.Id=%d inv2.Id=%d\n", inv1.Id, inv2.Id)
Update
Continuing the above example, use the Update
method to modify an Invoice:
// count is the # of rows updated, which should be 1 in this example
count, err := dbmap.Update(inv1)
Delete
If you have primary key(s) defined for a struct, you can use the Delete
method to remove rows:
count, err := dbmap.Delete(inv1)
Select by Key
Use the Get
method to fetch a single row by primary key. It returns
nil if no row is found.
// fetch Invoice with Id=99
obj, err := dbmap.Get(Invoice{}, 99)
inv := obj.(*Invoice)
Ad Hoc SQL
SELECT
Select()
and SelectOne()
provide a simple way to bind arbitrary queries to a slice
or a single struct.
// Select a slice - first return value is not needed when a slice pointer is passed to Select()
var posts []Post
_, err := dbmap.Select(&posts, "select * from post order by id")
// You can also use primitive types
var ids []string
_, err := dbmap.Select(&ids, "select id from post")
// Select a single row.
// Returns an error if no row found, or if more than one row is found
var post Post
err := dbmap.SelectOne(&post, "select * from post where id=?", id)
Want to do joins? Just write the SQL and the struct. gorp will bind them:
// Define a type for your join
// It *must* contain all the columns in your SELECT statement
//
// The names here should match the aliased column names you specify
// in your SQL - no additional binding work required. simple.
//
type InvoicePersonView struct {
InvoiceId int64
PersonId int64
Memo string
FName string
}
// Create some rows
p1 := &Person{0, 0, 0, "bob", "smith"}
dbmap.Insert(p1)
// notice how we can wire up p1.Id to the invoice easily
inv1 := &Invoice{0, 0, 0, "xmas order", p1.Id}
dbmap.Insert(inv1)
// Run your query
query := "select i.Id InvoiceId, p.Id PersonId, i.Memo, p.FName " +
"from invoice_test i, person_test p " +
"where i.PersonId = p.Id"
// pass a slice to Select()
var list []InvoicePersonView
_, err := dbmap.Select(&list, query)
// this should test true
expected := InvoicePersonView{inv1.Id, p1.Id, inv1.Memo, p1.FName}
if reflect.DeepEqual(list[0], expected) {
fmt.Println("Woot! My join worked!")
}
SELECT string or int64
gorp provides a few convenience methods for selecting a single string or int64.
// select single int64 from db (use $1 instead of ? for postgresql)
i64, err := dbmap.SelectInt("select count(*) from foo where blah=?", blahVal)
// select single string from db:
s, err := dbmap.SelectStr("select name from foo where blah=?", blahVal)
Named bind parameters
You may use a map or struct to bind parameters by name. This is currently only supported in SELECT queries.
_, err := dbm.Select(&dest, "select * from Foo where name = :name and age = :age", map[string]interface{}{
"name": "Rob",
"age": 31,
})
UPDATE / DELETE
You can execute raw SQL if you wish. Particularly good for batch operations.
res, err := dbmap.Exec("delete from invoice_test where PersonId=?", 10)
Transactions
You can batch operations into a transaction:
func InsertInv(dbmap *DbMap, inv *Invoice, per *Person) error {
// Start a new transaction
trans, err := dbmap.Begin()
if err != nil {
return err
}
trans.Insert(per)
inv.PersonId = per.Id
trans.Insert(inv)
// if the commit is successful, a nil error is returned
return trans.Commit()
}
Hooks
Use hooks to update data before/after saving to the db. Good for timestamps:
// implement the PreInsert and PreUpdate hooks
func (i *Invoice) PreInsert(s gorp.SqlExecutor) error {
i.Created = time.Now().UnixNano()
i.Updated = i.Created
return nil
}
func (i *Invoice) PreUpdate(s gorp.SqlExecutor) error {
i.Updated = time.Now().UnixNano()
return nil
}
// You can use the SqlExecutor to cascade additional SQL
// Take care to avoid cycles. gorp won't prevent them.
//
// Here's an example of a cascading delete
//
func (p *Person) PreDelete(s gorp.SqlExecutor) error {
query := "delete from invoice_test where PersonId=?"
err := s.Exec(query, p.Id); if err != nil {
return err
}
return nil
}
Full list of hooks that you can implement:
PostGet
PreInsert
PostInsert
PreUpdate
PostUpdate
PreDelete
PostDelete
All have the same signature. for example:
func (p *MyStruct) PostUpdate(s gorp.SqlExecutor) error
Optimistic Locking
gorp provides a simple optimistic locking feature, similar to Java's JPA, that
will raise an error if you try to update/delete a row whose version
column
has a value different than the one in memory. This provides a safe way to do
"select then update" style operations without explicit read and write locks.
// Version is an auto-incremented number, managed by gorp
// If this property is present on your struct, update
// operations will be constrained
//
// For example, say we defined Person as:
type Person struct {
Id int64
Created int64
Updated int64
FName string
LName string
// automatically used as the Version col
// use table.SetVersionCol("columnName") to map a different
// struct field as the version field
Version int64
}
p1 := &Person{0, 0, 0, "Bob", "Smith", 0}
dbmap.Insert(p1) // Version is now 1
obj, err := dbmap.Get(Person{}, p1.Id)
p2 := obj.(*Person)
p2.LName = "Edwards"
dbmap.Update(p2) // Version is now 2
p1.LName = "Howard"
// Raises error because p1.Version == 1, which is out of date
count, err := dbmap.Update(p1)
_, ok := err.(gorp.OptimisticLockError)
if ok {
// should reach this statement
// in a real app you might reload the row and retry, or
// you might propegate this to the user, depending on the desired
// semantics
fmt.Printf("Tried to update row with stale data: %v\n", err)
} else {
// some other db error occurred - log or return up the stack
fmt.Printf("Unknown db err: %v\n", err)
}
Database Drivers
gorp uses the Go 1 database/sql
package. A full list of compliant drivers is available here:
http://code.google.com/p/go-wiki/wiki/SQLDrivers
Sadly, SQL databases differ on various issues. gorp provides a Dialect interface that should be implemented per database vendor. Dialects are provided for:
- MySQL
- PostgreSQL
- sqlite3
Each of these three databases pass the test suite. See gorp_test.go
for example
DSNs for these three databases.
Support is also provided for:
- Oracle (contributed by @klaidliadon)
- SQL Server (contributed by @qrawl) - use driver: github.com/denisenkom/go-mssqldb
Note that these databases are not covered by CI and I (@coopernurse) have no good way to test them locally. So please try them and send patches as needed, but expect a bit more unpredicability.
Known Issues
SQL placeholder portability
Different databases use different strings to indicate variable placeholders in
prepared SQL statements. Unlike some database abstraction layers (such as JDBC),
Go's database/sql
does not standardize this.
SQL generated by gorp in the Insert
, Update
, Delete
, and Get
methods delegates
to a Dialect implementation for each database, and will generate portable SQL.
Raw SQL strings passed to Exec
, Select
, SelectOne
, SelectInt
, etc will not be
parsed. Consequently you may have portability issues if you write a query like this:
// works on MySQL and Sqlite3, but not with Postgresql
err := dbmap.SelectOne(&val, "select * from foo where id = ?", 30)
In Select
and SelectOne
you can use named parameters to work around this.
The following is portable:
err := dbmap.SelectOne(&val, "select * from foo where id = :id",
map[string]interface{} { "id": 30})
time.Time and time zones
gorp will pass time.Time
fields through to the database/sql
driver, but note that
the behavior of this type varies across database drivers.
MySQL users should be especially cautious. See: https://github.com/ziutek/mymysql/pull/77
To avoid any potential issues with timezone/DST, consider using an integer field for time data and storing UNIX time.
Running the tests
The included tests may be run against MySQL, Postgresql, or sqlite3. You must set two environment variables so the test code knows which driver to use, and how to connect to your database.
# MySQL example:
export GORP_TEST_DSN=gomysql_test/gomysql_test/abc123
export GORP_TEST_DIALECT=mysql
# run the tests
go test
# run the tests and benchmarks
go test -bench="Bench" -benchtime 10
Valid GORP_TEST_DIALECT
values are: "mysql", "postgres", "sqlite3"
See the test_all.sh
script for examples of all 3 databases. This is the script I run
locally to test the library.
Performance
gorp uses reflection to construct SQL queries and bind parameters. See the BenchmarkNativeCrud vs BenchmarkGorpCrud in gorp_test.go for a simple perf test. On my MacBook Pro gorp is about 2-3% slower than hand written SQL.
Pull requests / Contributions
Contributions are very welcome. Please follow these guidelines:
- Fork the
develop
branch and issue pull requests targeting thedevelop
branch- If you don't do this, I'll likely cherry pick your commit into develop
- If you are adding an enhancement, please open an issue first with your proposed change.
- Changes that break backwards compatibility in the public API are only accepted after we discuss on a GitHub issue for a while.
Thanks!
Contributors
- matthias-margush - column aliasing via tags
- Rob Figueiredo - @robfig
- Quinn Slack - @sqs
Documentation
¶
Overview ¶
Package gorp provides a simple way to marshal Go structs to and from SQL databases. It uses the database/sql package, and should work with any compliant database/sql driver.
Source code and project home: https://github.com/coopernurse/gorp
Index ¶
- func SelectFloat(e SqlExecutor, query string, args ...interface{}) (float64, error)
- func SelectInt(e SqlExecutor, query string, args ...interface{}) (int64, error)
- func SelectNullFloat(e SqlExecutor, query string, args ...interface{}) (sql.NullFloat64, error)
- func SelectNullInt(e SqlExecutor, query string, args ...interface{}) (sql.NullInt64, error)
- func SelectNullStr(e SqlExecutor, query string, args ...interface{}) (sql.NullString, error)
- func SelectOne(m *DbMap, e SqlExecutor, holder interface{}, query string, args ...interface{}) error
- func SelectStr(e SqlExecutor, query string, args ...interface{}) (string, error)
- type ColumnMap
- type CustomScanner
- type DbMap
- func (m *DbMap) AddTable(i interface{}) *TableMap
- func (m *DbMap) AddTableWithName(i interface{}, name string) *TableMap
- func (m *DbMap) AddTableWithNameAndSchema(i interface{}, schema string, name string) *TableMap
- func (m *DbMap) Begin() (*Transaction, error)
- func (m *DbMap) CreateTables() error
- func (m *DbMap) CreateTablesIfNotExists() error
- func (m *DbMap) Delete(list ...interface{}) (int64, error)
- func (m *DbMap) DropTable(table interface{}) error
- func (m *DbMap) DropTableIfExists(table interface{}) error
- func (m *DbMap) DropTables() error
- func (m *DbMap) DropTablesIfExists() error
- func (m *DbMap) Exec(query string, args ...interface{}) (sql.Result, error)
- func (m *DbMap) Get(i interface{}, keys ...interface{}) (interface{}, error)
- func (m *DbMap) Insert(list ...interface{}) error
- func (m *DbMap) Select(i interface{}, query string, args ...interface{}) ([]interface{}, error)
- func (m *DbMap) SelectFloat(query string, args ...interface{}) (float64, error)
- func (m *DbMap) SelectInt(query string, args ...interface{}) (int64, error)
- func (m *DbMap) SelectNullFloat(query string, args ...interface{}) (sql.NullFloat64, error)
- func (m *DbMap) SelectNullInt(query string, args ...interface{}) (sql.NullInt64, error)
- func (m *DbMap) SelectNullStr(query string, args ...interface{}) (sql.NullString, error)
- func (m *DbMap) SelectOne(holder interface{}, query string, args ...interface{}) error
- func (m *DbMap) SelectStr(query string, args ...interface{}) (string, error)
- func (m *DbMap) TableFor(t reflect.Type, checkPK bool) (*TableMap, error)
- func (m *DbMap) TraceOff()
- func (m *DbMap) TraceOn(prefix string, logger GorpLogger)
- func (m *DbMap) TruncateTables() error
- func (m *DbMap) Update(list ...interface{}) (int64, error)
- type Dialect
- type GorpLogger
- type HasPostDelete
- type HasPostGet
- type HasPostInsert
- type HasPostUpdate
- type HasPreDelete
- type HasPreInsert
- type HasPreUpdate
- type IntegerAutoIncrInserter
- type MySQLDialect
- func (d MySQLDialect) AutoIncrBindValue() string
- func (d MySQLDialect) AutoIncrInsertSuffix(col *ColumnMap) string
- func (d MySQLDialect) AutoIncrStr() string
- func (d MySQLDialect) BindVar(i int) string
- func (d MySQLDialect) CreateTableSuffix() string
- func (d MySQLDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
- func (d MySQLDialect) QuerySuffix() string
- func (d MySQLDialect) QuoteField(f string) string
- func (d MySQLDialect) QuotedTableForQuery(schema string, table string) string
- func (d MySQLDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string
- func (d MySQLDialect) TruncateClause() string
- type NullTime
- type OptimisticLockError
- type OracleDialect
- func (d OracleDialect) AutoIncrBindValue() string
- func (d OracleDialect) AutoIncrInsertSuffix(col *ColumnMap) string
- func (d OracleDialect) AutoIncrStr() string
- func (d OracleDialect) BindVar(i int) string
- func (d OracleDialect) CreateTableSuffix() string
- func (d OracleDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
- func (d OracleDialect) QuerySuffix() string
- func (d OracleDialect) QuoteField(f string) string
- func (d OracleDialect) QuotedTableForQuery(schema string, table string) string
- func (d OracleDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string
- func (d OracleDialect) TruncateClause() string
- type OracleString
- type PostgresDialect
- func (d PostgresDialect) AutoIncrBindValue() string
- func (d PostgresDialect) AutoIncrInsertSuffix(col *ColumnMap) string
- func (d PostgresDialect) AutoIncrStr() string
- func (d PostgresDialect) BindVar(i int) string
- func (d PostgresDialect) CreateTableSuffix() string
- func (d PostgresDialect) InsertAutoIncrToTarget(exec SqlExecutor, insertSql string, target interface{}, params ...interface{}) error
- func (d PostgresDialect) QuerySuffix() string
- func (d PostgresDialect) QuoteField(f string) string
- func (d PostgresDialect) QuotedTableForQuery(schema string, table string) string
- func (d PostgresDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string
- func (d PostgresDialect) TruncateClause() string
- type SqlExecutor
- type SqlServerDialect
- func (d SqlServerDialect) AutoIncrBindValue() string
- func (d SqlServerDialect) AutoIncrInsertSuffix(col *ColumnMap) string
- func (d SqlServerDialect) AutoIncrStr() string
- func (d SqlServerDialect) BindVar(i int) string
- func (d SqlServerDialect) CreateTableSuffix() string
- func (d SqlServerDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
- func (d SqlServerDialect) QuerySuffix() string
- func (d SqlServerDialect) QuoteField(f string) string
- func (d SqlServerDialect) QuotedTableForQuery(schema string, table string) string
- func (d SqlServerDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string
- func (d SqlServerDialect) TruncateClause() string
- type SqliteDialect
- func (d SqliteDialect) AutoIncrBindValue() string
- func (d SqliteDialect) AutoIncrInsertSuffix(col *ColumnMap) string
- func (d SqliteDialect) AutoIncrStr() string
- func (d SqliteDialect) BindVar(i int) string
- func (d SqliteDialect) CreateTableSuffix() string
- func (d SqliteDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
- func (d SqliteDialect) QuerySuffix() string
- func (d SqliteDialect) QuoteField(f string) string
- func (d SqliteDialect) QuotedTableForQuery(schema string, table string) string
- func (d SqliteDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string
- func (d SqliteDialect) TruncateClause() string
- type TableMap
- type TargetedAutoIncrInserter
- type Transaction
- func (t *Transaction) Commit() error
- func (t *Transaction) Delete(list ...interface{}) (int64, error)
- func (t *Transaction) Exec(query string, args ...interface{}) (sql.Result, error)
- func (t *Transaction) Get(i interface{}, keys ...interface{}) (interface{}, error)
- func (t *Transaction) Insert(list ...interface{}) error
- func (t *Transaction) ReleaseSavepoint(savepoint string) error
- func (t *Transaction) Rollback() error
- func (t *Transaction) RollbackToSavepoint(savepoint string) error
- func (t *Transaction) Savepoint(name string) error
- func (t *Transaction) Select(i interface{}, query string, args ...interface{}) ([]interface{}, error)
- func (t *Transaction) SelectFloat(query string, args ...interface{}) (float64, error)
- func (t *Transaction) SelectInt(query string, args ...interface{}) (int64, error)
- func (t *Transaction) SelectNullFloat(query string, args ...interface{}) (sql.NullFloat64, error)
- func (t *Transaction) SelectNullInt(query string, args ...interface{}) (sql.NullInt64, error)
- func (t *Transaction) SelectNullStr(query string, args ...interface{}) (sql.NullString, error)
- func (t *Transaction) SelectOne(holder interface{}, query string, args ...interface{}) error
- func (t *Transaction) SelectStr(query string, args ...interface{}) (string, error)
- func (t *Transaction) Update(list ...interface{}) (int64, error)
- type TypeConverter
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func SelectFloat ¶
func SelectFloat(e SqlExecutor, query string, args ...interface{}) (float64, error)
SelectFloat executes the given query, which should be a SELECT statement for a single float column, and returns the value of the first row returned. If no rows are found, zero is returned.
func SelectInt ¶
func SelectInt(e SqlExecutor, query string, args ...interface{}) (int64, error)
SelectInt executes the given query, which should be a SELECT statement for a single integer column, and returns the value of the first row returned. If no rows are found, zero is returned.
func SelectNullFloat ¶
func SelectNullFloat(e SqlExecutor, query string, args ...interface{}) (sql.NullFloat64, error)
SelectNullFloat executes the given query, which should be a SELECT statement for a single float column, and returns the value of the first row returned. If no rows are found, the empty sql.NullInt64 value is returned.
func SelectNullInt ¶
func SelectNullInt(e SqlExecutor, query string, args ...interface{}) (sql.NullInt64, error)
SelectNullInt executes the given query, which should be a SELECT statement for a single integer column, and returns the value of the first row returned. If no rows are found, the empty sql.NullInt64 value is returned.
func SelectNullStr ¶
func SelectNullStr(e SqlExecutor, query string, args ...interface{}) (sql.NullString, error)
SelectNullStr executes the given query, which should be a SELECT statement for a single char/varchar column, and returns the value of the first row returned. If no rows are found, the empty sql.NullString is returned.
func SelectOne ¶
func SelectOne(m *DbMap, e SqlExecutor, holder interface{}, query string, args ...interface{}) error
SelectOne executes the given query (which should be a SELECT statement) and binds the result to holder, which must be a pointer.
If no row is found, an an error (sql.ErrNoRows specifically) will be returned ¶
If more than one row is found, an error will be returned.
func SelectStr ¶
func SelectStr(e SqlExecutor, query string, args ...interface{}) (string, error)
SelectStr executes the given query, which should be a SELECT statement for a single char/varchar column, and returns the value of the first row returned. If no rows are found, an empty string is returned.
Types ¶
type ColumnMap ¶
type ColumnMap struct { // Column name in db table ColumnName string // If true, this column is skipped in generated SQL statements Transient bool // If true, " unique" is added to create table statements. // Not used elsewhere Unique bool // Passed to Dialect.ToSqlType() to assist in informing the // correct column type to map to in CreateTables() // Not used elsewhere MaxSize int // contains filtered or unexported fields }
ColumnMap represents a mapping between a Go struct field and a single column in a table. Unique and MaxSize only inform the CreateTables() function and are not used by Insert/Update/Delete/Get.
func (*ColumnMap) Rename ¶
Rename allows you to specify the column name in the table
Example: table.ColMap("Updated").Rename("date_updated")
func (*ColumnMap) SetMaxSize ¶
SetMaxSize specifies the max length of values of this column. This is passed to the dialect.ToSqlType() function, which can use the value to alter the generated type for "create table" statements
func (*ColumnMap) SetNotNull ¶
SetNotNull adds "not null" to the create table statements for this column, if nn is true.
func (*ColumnMap) SetTransient ¶
SetTransient allows you to mark the column as transient. If true this column will be skipped when SQL statements are generated
type CustomScanner ¶
type CustomScanner struct { // After a row is scanned, Holder will contain the value from the database column. // Initialize the CustomScanner with the concrete Go type you wish the database // driver to scan the raw column into. Holder interface{} // Target typically holds a pointer to the target struct field to bind the Holder // value to. Target interface{} // Binder is a custom function that converts the holder value to the target type // and sets target accordingly. This function should return error if a problem // occurs converting the holder to the target. Binder func(holder interface{}, target interface{}) error }
CustomScanner binds a database column value to a Go type
func (CustomScanner) Bind ¶
func (me CustomScanner) Bind() error
Bind is called automatically by gorp after Scan()
type DbMap ¶
type DbMap struct { // Db handle to use with this map Db *sql.DB // Dialect implementation to use with this map Dialect Dialect TypeConverter TypeConverter // contains filtered or unexported fields }
DbMap is the root gorp mapping object. Create one of these for each database schema you wish to map. Each DbMap contains a list of mapped tables.
Example:
dialect := gorp.MySQLDialect{"InnoDB", "UTF8"} dbmap := &gorp.DbMap{Db: db, Dialect: dialect}
func (*DbMap) AddTable ¶
AddTable registers the given interface type with gorp. The table name will be given the name of the TypeOf(i). You must call this function, or AddTableWithName, for any struct type you wish to persist with the given DbMap.
This operation is idempotent. If i's type is already mapped, the existing *TableMap is returned
func (*DbMap) AddTableWithName ¶
AddTableWithName has the same behavior as AddTable, but sets table.TableName to name.
func (*DbMap) AddTableWithNameAndSchema ¶ added in v1.6.1
AddTableWithNameAndSchema has the same behavior as AddTable, but sets table.TableName to name.
func (*DbMap) CreateTables ¶
CreateTables iterates through TableMaps registered to this DbMap and executes "create table" statements against the database for each.
This is particularly useful in unit tests where you want to create and destroy the schema automatically.
func (*DbMap) CreateTablesIfNotExists ¶
CreateTablesIfNotExists is similar to CreateTables, but starts each statement with "create table if not exists" so that existing tables do not raise errors
func (*DbMap) Delete ¶
Delete runs a SQL DELETE statement for each element in list. List items must be pointers.
The hook functions PreDelete() and/or PostDelete() will be executed before/after the DELETE statement if the interface defines them.
Returns the number of rows deleted.
Returns an error if SetKeys has not been called on the TableMap Panics if any interface in the list has not been registered with AddTable
func (*DbMap) DropTable ¶ added in v1.6.1
DropTable drops an individual table. Will throw an error if the table does not exist.
func (*DbMap) DropTableIfExists ¶ added in v1.6.1
DropTable drops an individual table. Will NOT throw an error if the table does not exist.
func (*DbMap) DropTables ¶
DropTables iterates through TableMaps registered to this DbMap and executes "drop table" statements against the database for each.
func (*DbMap) DropTablesIfExists ¶
DropTablesIfExists is the same as DropTables, but uses the "if exists" clause to avoid errors for tables that do not exist.
func (*DbMap) Exec ¶
Exec runs an arbitrary SQL statement. args represent the bind parameters. This is equivalent to running: Exec() using database/sql
func (*DbMap) Get ¶
Get runs a SQL SELECT to fetch a single row from the table based on the primary key(s)
i should be an empty value for the struct to load. keys should be the primary key value(s) for the row to load. If multiple keys exist on the table, the order should match the column order specified in SetKeys() when the table mapping was defined.
The hook function PostGet() will be executed after the SELECT statement if the interface defines them.
Returns a pointer to a struct that matches or nil if no row is found.
Returns an error if SetKeys has not been called on the TableMap Panics if any interface in the list has not been registered with AddTable
func (*DbMap) Insert ¶
Insert runs a SQL INSERT statement for each element in list. List items must be pointers.
Any interface whose TableMap has an auto-increment primary key will have its last insert id bound to the PK field on the struct.
The hook functions PreInsert() and/or PostInsert() will be executed before/after the INSERT statement if the interface defines them.
Panics if any interface in the list has not been registered with AddTable
func (*DbMap) Select ¶
Select runs an arbitrary SQL query, binding the columns in the result to fields on the struct specified by i. args represent the bind parameters for the SQL statement.
Column names on the SELECT statement should be aliased to the field names on the struct i. Returns an error if one or more columns in the result do not match. It is OK if fields on i are not part of the SQL statement.
The hook function PostGet() will be executed after the SELECT statement if the interface defines them.
Values are returned in one of two ways: 1. If i is a struct or a pointer to a struct, returns a slice of pointers to matching rows of type i. 2. If i is a pointer to a slice, the results will be appended to that slice and nil returned.
i does NOT need to be registered with AddTable()
func (*DbMap) SelectFloat ¶
SelectFloat is a convenience wrapper around the gorp.SelectFlot function
func (*DbMap) SelectNullFloat ¶
func (m *DbMap) SelectNullFloat(query string, args ...interface{}) (sql.NullFloat64, error)
SelectNullFloat is a convenience wrapper around the gorp.SelectNullFloat function
func (*DbMap) SelectNullInt ¶
SelectNullInt is a convenience wrapper around the gorp.SelectNullInt function
func (*DbMap) SelectNullStr ¶
func (m *DbMap) SelectNullStr(query string, args ...interface{}) (sql.NullString, error)
SelectNullStr is a convenience wrapper around the gorp.SelectNullStr function
func (*DbMap) TableFor ¶ added in v1.6.1
TableFor returns the *TableMap corresponding to the given Go Type If no table is mapped to that type an error is returned. If checkPK is true and the mapped table has no registered PKs, an error is returned.
func (*DbMap) TraceOn ¶
func (m *DbMap) TraceOn(prefix string, logger GorpLogger)
TraceOn turns on SQL statement logging for this DbMap. After this is called, all SQL statements will be sent to the logger. If prefix is a non-empty string, it will be written to the front of all logged strings, which can aid in filtering log lines.
Use TraceOn if you want to spy on the SQL statements that gorp generates.
Note that the base log.Logger type satisfies GorpLogger, but adapters can easily be written for other logging packages (e.g., the golang-sanctioned glog framework).
func (*DbMap) TruncateTables ¶
TruncateTables iterates through TableMaps registered to this DbMap and executes "truncate table" statements against the database for each, or in the case of sqlite, a "delete from" with no "where" clause, which uses the truncate optimization (http://www.sqlite.org/lang_delete.html)
func (*DbMap) Update ¶
Update runs a SQL UPDATE statement for each element in list. List items must be pointers.
The hook functions PreUpdate() and/or PostUpdate() will be executed before/after the UPDATE statement if the interface defines them.
Returns the number of rows updated.
Returns an error if SetKeys has not been called on the TableMap Panics if any interface in the list has not been registered with AddTable
type Dialect ¶
type Dialect interface { // adds a suffix to any query, usually ";" QuerySuffix() string // ToSqlType returns the SQL column type to use when creating a // table of the given Go Type. maxsize can be used to switch based on // size. For example, in MySQL []byte could map to BLOB, MEDIUMBLOB, // or LONGBLOB depending on the maxsize ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string // string to append to primary key column definitions AutoIncrStr() string // string to bind autoincrement columns to. Empty string will // remove reference to those columns in the INSERT statement. AutoIncrBindValue() string AutoIncrInsertSuffix(col *ColumnMap) string // string to append to "create table" statement for vendor specific // table attributes CreateTableSuffix() string // string to truncate tables TruncateClause() string // bind variable string to use when forming SQL statements // in many dbs it is "?", but Postgres appears to use $1 // // i is a zero based index of the bind variable in this statement // BindVar(i int) string // Handles quoting of a field name to ensure that it doesn't raise any // SQL parsing exceptions by using a reserved word as a field name. QuoteField(field string) string // Handles building up of a schema.database string that is compatible with // the given dialect // // schema - The schema that <table> lives in // table - The table name QuotedTableForQuery(schema string, table string) string }
The Dialect interface encapsulates behaviors that differ across SQL databases. At present the Dialect is only used by CreateTables() but this could change in the future
type GorpLogger ¶ added in v1.6.1
type GorpLogger interface {
Printf(format string, v ...interface{})
}
type HasPostDelete ¶ added in v1.6.1
type HasPostDelete interface {
PostDelete(SqlExecutor) error
}
PostUpdate() will be executed after the DELETE statement
type HasPostGet ¶ added in v1.6.1
type HasPostGet interface {
PostGet(SqlExecutor) error
}
PostUpdate() will be executed after the GET statement.
type HasPostInsert ¶ added in v1.6.1
type HasPostInsert interface {
PostInsert(SqlExecutor) error
}
PostInsert() will be executed after the INSERT statement
type HasPostUpdate ¶ added in v1.6.1
type HasPostUpdate interface {
PostUpdate(SqlExecutor) error
}
PostUpdate() will be executed after the UPDATE statement
type HasPreDelete ¶ added in v1.6.1
type HasPreDelete interface {
PreDelete(SqlExecutor) error
}
PreDelete() will be executed before the DELETE statement.
type HasPreInsert ¶ added in v1.6.1
type HasPreInsert interface {
PreInsert(SqlExecutor) error
}
PreInsert() will be executed before INSERT statement.
type HasPreUpdate ¶ added in v1.6.1
type HasPreUpdate interface {
PreUpdate(SqlExecutor) error
}
PreUpdate() will be executed before UPDATE statement.
type IntegerAutoIncrInserter ¶ added in v1.6.1
type IntegerAutoIncrInserter interface {
InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
}
IntegerAutoIncrInserter is implemented by dialects that can perform inserts with automatically incremented integer primary keys. If the dialect can handle automatic assignment of more than just integers, see TargetedAutoIncrInserter.
type MySQLDialect ¶
type MySQLDialect struct { // Engine is the storage engine to use "InnoDB" vs "MyISAM" for example Engine string // Encoding is the character encoding to use for created tables Encoding string }
Implementation of Dialect for MySQL databases.
func (MySQLDialect) AutoIncrBindValue ¶
func (d MySQLDialect) AutoIncrBindValue() string
func (MySQLDialect) AutoIncrInsertSuffix ¶
func (d MySQLDialect) AutoIncrInsertSuffix(col *ColumnMap) string
func (MySQLDialect) CreateTableSuffix ¶
func (d MySQLDialect) CreateTableSuffix() string
Returns engine=%s charset=%s based on values stored on struct
func (MySQLDialect) InsertAutoIncr ¶
func (d MySQLDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
func (MySQLDialect) QuerySuffix ¶ added in v1.6.1
func (d MySQLDialect) QuerySuffix() string
func (MySQLDialect) QuoteField ¶
func (d MySQLDialect) QuoteField(f string) string
func (MySQLDialect) QuotedTableForQuery ¶ added in v1.6.1
func (d MySQLDialect) QuotedTableForQuery(schema string, table string) string
func (MySQLDialect) TruncateClause ¶
func (d MySQLDialect) TruncateClause() string
type NullTime ¶ added in v1.6.1
A nullable Time value
type OptimisticLockError ¶
type OptimisticLockError struct { // Table name where the lock error occurred TableName string // Primary key values of the row being updated/deleted Keys []interface{} // true if a row was found with those keys, indicating the // LocalVersion is stale. false if no value was found with those // keys, suggesting the row has been deleted since loaded, or // was never inserted to begin with RowExists bool // Version value on the struct passed to Update/Delete. This value is // out of sync with the database. LocalVersion int64 }
OptimisticLockError is returned by Update() or Delete() if the struct being modified has a Version field and the value is not equal to the current value in the database
func (OptimisticLockError) Error ¶
func (e OptimisticLockError) Error() string
Error returns a description of the cause of the lock error
type OracleDialect ¶ added in v1.6.1
type OracleDialect struct{}
Implementation of Dialect for Oracle databases.
func (OracleDialect) AutoIncrBindValue ¶ added in v1.6.1
func (d OracleDialect) AutoIncrBindValue() string
func (OracleDialect) AutoIncrInsertSuffix ¶ added in v1.6.1
func (d OracleDialect) AutoIncrInsertSuffix(col *ColumnMap) string
func (OracleDialect) AutoIncrStr ¶ added in v1.6.1
func (d OracleDialect) AutoIncrStr() string
Returns empty string
func (OracleDialect) BindVar ¶ added in v1.6.1
func (d OracleDialect) BindVar(i int) string
Returns "$(i+1)"
func (OracleDialect) CreateTableSuffix ¶ added in v1.6.1
func (d OracleDialect) CreateTableSuffix() string
Returns suffix
func (OracleDialect) InsertAutoIncr ¶ added in v1.6.1
func (d OracleDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
func (OracleDialect) QuerySuffix ¶ added in v1.6.1
func (d OracleDialect) QuerySuffix() string
func (OracleDialect) QuoteField ¶ added in v1.6.1
func (d OracleDialect) QuoteField(f string) string
func (OracleDialect) QuotedTableForQuery ¶ added in v1.6.1
func (d OracleDialect) QuotedTableForQuery(schema string, table string) string
func (OracleDialect) TruncateClause ¶ added in v1.6.1
func (d OracleDialect) TruncateClause() string
type OracleString ¶ added in v1.6.1
type OracleString struct {
sql.NullString
}
Oracle String (empty string is null)
func (*OracleString) Scan ¶ added in v1.6.1
func (os *OracleString) Scan(value interface{}) error
Scan implements the Scanner interface.
type PostgresDialect ¶
type PostgresDialect struct {
// contains filtered or unexported fields
}
func (PostgresDialect) AutoIncrBindValue ¶
func (d PostgresDialect) AutoIncrBindValue() string
func (PostgresDialect) AutoIncrInsertSuffix ¶
func (d PostgresDialect) AutoIncrInsertSuffix(col *ColumnMap) string
func (PostgresDialect) AutoIncrStr ¶
func (d PostgresDialect) AutoIncrStr() string
Returns empty string
func (PostgresDialect) CreateTableSuffix ¶
func (d PostgresDialect) CreateTableSuffix() string
Returns suffix
func (PostgresDialect) InsertAutoIncrToTarget ¶ added in v1.6.1
func (d PostgresDialect) InsertAutoIncrToTarget(exec SqlExecutor, insertSql string, target interface{}, params ...interface{}) error
func (PostgresDialect) QuerySuffix ¶ added in v1.6.1
func (d PostgresDialect) QuerySuffix() string
func (PostgresDialect) QuoteField ¶
func (d PostgresDialect) QuoteField(f string) string
func (PostgresDialect) QuotedTableForQuery ¶ added in v1.6.1
func (d PostgresDialect) QuotedTableForQuery(schema string, table string) string
func (PostgresDialect) TruncateClause ¶
func (d PostgresDialect) TruncateClause() string
type SqlExecutor ¶
type SqlExecutor interface { Get(i interface{}, keys ...interface{}) (interface{}, error) Insert(list ...interface{}) error Update(list ...interface{}) (int64, error) Delete(list ...interface{}) (int64, error) Exec(query string, args ...interface{}) (sql.Result, error) Select(i interface{}, query string, args ...interface{}) ([]interface{}, error) SelectInt(query string, args ...interface{}) (int64, error) SelectNullInt(query string, args ...interface{}) (sql.NullInt64, error) SelectFloat(query string, args ...interface{}) (float64, error) SelectNullFloat(query string, args ...interface{}) (sql.NullFloat64, error) SelectStr(query string, args ...interface{}) (string, error) SelectNullStr(query string, args ...interface{}) (sql.NullString, error) SelectOne(holder interface{}, query string, args ...interface{}) error // contains filtered or unexported methods }
SqlExecutor exposes gorp operations that can be run from Pre/Post hooks. This hides whether the current operation that triggered the hook is in a transaction.
See the DbMap function docs for each of the functions below for more information.
type SqlServerDialect ¶ added in v1.6.1
type SqlServerDialect struct {
// contains filtered or unexported fields
}
func (SqlServerDialect) AutoIncrBindValue ¶ added in v1.6.1
func (d SqlServerDialect) AutoIncrBindValue() string
Empty string removes autoincrement columns from the INSERT statements.
func (SqlServerDialect) AutoIncrInsertSuffix ¶ added in v1.6.1
func (d SqlServerDialect) AutoIncrInsertSuffix(col *ColumnMap) string
func (SqlServerDialect) AutoIncrStr ¶ added in v1.6.1
func (d SqlServerDialect) AutoIncrStr() string
Returns auto_increment
func (SqlServerDialect) BindVar ¶ added in v1.6.1
func (d SqlServerDialect) BindVar(i int) string
Returns "?"
func (SqlServerDialect) CreateTableSuffix ¶ added in v1.6.1
func (d SqlServerDialect) CreateTableSuffix() string
Returns suffix
func (SqlServerDialect) InsertAutoIncr ¶ added in v1.6.1
func (d SqlServerDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
func (SqlServerDialect) QuerySuffix ¶ added in v1.6.1
func (d SqlServerDialect) QuerySuffix() string
func (SqlServerDialect) QuoteField ¶ added in v1.6.1
func (d SqlServerDialect) QuoteField(f string) string
func (SqlServerDialect) QuotedTableForQuery ¶ added in v1.6.1
func (d SqlServerDialect) QuotedTableForQuery(schema string, table string) string
func (SqlServerDialect) TruncateClause ¶ added in v1.6.1
func (d SqlServerDialect) TruncateClause() string
type SqliteDialect ¶
type SqliteDialect struct {
// contains filtered or unexported fields
}
func (SqliteDialect) AutoIncrBindValue ¶
func (d SqliteDialect) AutoIncrBindValue() string
func (SqliteDialect) AutoIncrInsertSuffix ¶
func (d SqliteDialect) AutoIncrInsertSuffix(col *ColumnMap) string
func (SqliteDialect) AutoIncrStr ¶
func (d SqliteDialect) AutoIncrStr() string
Returns autoincrement
func (SqliteDialect) CreateTableSuffix ¶
func (d SqliteDialect) CreateTableSuffix() string
Returns suffix
func (SqliteDialect) InsertAutoIncr ¶
func (d SqliteDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
func (SqliteDialect) QuerySuffix ¶ added in v1.6.1
func (d SqliteDialect) QuerySuffix() string
func (SqliteDialect) QuoteField ¶
func (d SqliteDialect) QuoteField(f string) string
func (SqliteDialect) QuotedTableForQuery ¶ added in v1.6.1
func (d SqliteDialect) QuotedTableForQuery(schema string, table string) string
sqlite does not have schemas like PostgreSQL does, so just escape it like normal
func (SqliteDialect) TruncateClause ¶
func (d SqliteDialect) TruncateClause() string
With sqlite, there technically isn't a TRUNCATE statement, but a DELETE FROM uses a truncate optimization: http://www.sqlite.org/lang_delete.html
type TableMap ¶
type TableMap struct { // Name of database table. TableName string SchemaName string Columns []*ColumnMap // contains filtered or unexported fields }
TableMap represents a mapping between a Go struct and a database table Use dbmap.AddTable() or dbmap.AddTableWithName() to create these
func (*TableMap) ColMap ¶
ColMap returns the ColumnMap pointer matching the given struct field name. It panics if the struct does not contain a field matching this name.
func (*TableMap) ResetSql ¶
func (t *TableMap) ResetSql()
ResetSql removes cached insert/update/select/delete SQL strings associated with this TableMap. Call this if you've modified any column names or the table name itself.
func (*TableMap) SetKeys ¶
SetKeys lets you specify the fields on a struct that map to primary key columns on the table. If isAutoIncr is set, result.LastInsertId() will be used after INSERT to bind the generated id to the Go struct.
Automatically calls ResetSql() to ensure SQL statements are regenerated.
Panics if isAutoIncr is true, and fieldNames length != 1
func (*TableMap) SetUniqueTogether ¶ added in v1.6.1
SetUniqueTogether lets you specify uniqueness constraints across multiple columns on the table. Each call adds an additional constraint for the specified columns.
Automatically calls ResetSql() to ensure SQL statements are regenerated.
Panics if fieldNames length < 2.
func (*TableMap) SetVersionCol ¶
SetVersionCol sets the column to use as the Version field. By default the "Version" field is used. Returns the column found, or panics if the struct does not contain a field matching this name.
Automatically calls ResetSql() to ensure SQL statements are regenerated.
type TargetedAutoIncrInserter ¶ added in v1.6.1
type TargetedAutoIncrInserter interface { // InsertAutoIncrToTarget runs an insert operation and assigns the // automatically generated primary key directly to the passed in // target. The target should be a pointer to the primary key // field of the value being inserted. InsertAutoIncrToTarget(exec SqlExecutor, insertSql string, target interface{}, params ...interface{}) error }
TargetedAutoIncrInserter is implemented by dialects that can perform automatic assignment of any primary key type (i.e. strings for uuids, integers for serials, etc).
type Transaction ¶
type Transaction struct {
// contains filtered or unexported fields
}
Transaction represents a database transaction. Insert/Update/Delete/Get/Exec operations will be run in the context of that transaction. Transactions should be terminated with a call to Commit() or Rollback()
func (*Transaction) Commit ¶
func (t *Transaction) Commit() error
Commit commits the underlying database transaction.
func (*Transaction) Delete ¶
func (t *Transaction) Delete(list ...interface{}) (int64, error)
Delete has the same behavior as DbMap.Delete(), but runs in a transaction.
func (*Transaction) Exec ¶
func (t *Transaction) Exec(query string, args ...interface{}) (sql.Result, error)
Exec has the same behavior as DbMap.Exec(), but runs in a transaction.
func (*Transaction) Get ¶
func (t *Transaction) Get(i interface{}, keys ...interface{}) (interface{}, error)
Get has the same behavior as DbMap.Get(), but runs in a transaction.
func (*Transaction) Insert ¶
func (t *Transaction) Insert(list ...interface{}) error
Insert has the same behavior as DbMap.Insert(), but runs in a transaction.
func (*Transaction) ReleaseSavepoint ¶
func (t *Transaction) ReleaseSavepoint(savepoint string) error
ReleaseSavepint releases the savepoint with the given name. The name is interpolated directly into the SQL SAVEPOINT statement, so you must sanitize it if it is derived from user input.
func (*Transaction) Rollback ¶
func (t *Transaction) Rollback() error
Rollback rolls back the underlying database transaction.
func (*Transaction) RollbackToSavepoint ¶
func (t *Transaction) RollbackToSavepoint(savepoint string) error
RollbackToSavepoint rolls back to the savepoint with the given name. The name is interpolated directly into the SQL SAVEPOINT statement, so you must sanitize it if it is derived from user input.
func (*Transaction) Savepoint ¶
func (t *Transaction) Savepoint(name string) error
Savepoint creates a savepoint with the given name. The name is interpolated directly into the SQL SAVEPOINT statement, so you must sanitize it if it is derived from user input.
func (*Transaction) Select ¶
func (t *Transaction) Select(i interface{}, query string, args ...interface{}) ([]interface{}, error)
Select has the same behavior as DbMap.Select(), but runs in a transaction.
func (*Transaction) SelectFloat ¶
func (t *Transaction) SelectFloat(query string, args ...interface{}) (float64, error)
SelectFloat is a convenience wrapper around the gorp.SelectFloat function.
func (*Transaction) SelectInt ¶
func (t *Transaction) SelectInt(query string, args ...interface{}) (int64, error)
SelectInt is a convenience wrapper around the gorp.SelectInt function.
func (*Transaction) SelectNullFloat ¶
func (t *Transaction) SelectNullFloat(query string, args ...interface{}) (sql.NullFloat64, error)
SelectNullFloat is a convenience wrapper around the gorp.SelectNullFloat function.
func (*Transaction) SelectNullInt ¶
func (t *Transaction) SelectNullInt(query string, args ...interface{}) (sql.NullInt64, error)
SelectNullInt is a convenience wrapper around the gorp.SelectNullInt function.
func (*Transaction) SelectNullStr ¶
func (t *Transaction) SelectNullStr(query string, args ...interface{}) (sql.NullString, error)
SelectNullStr is a convenience wrapper around the gorp.SelectNullStr function.
func (*Transaction) SelectOne ¶
func (t *Transaction) SelectOne(holder interface{}, query string, args ...interface{}) error
SelectOne is a convenience wrapper around the gorp.SelectOne function.
func (*Transaction) SelectStr ¶
func (t *Transaction) SelectStr(query string, args ...interface{}) (string, error)
SelectStr is a convenience wrapper around the gorp.SelectStr function.
func (*Transaction) Update ¶
func (t *Transaction) Update(list ...interface{}) (int64, error)
Update had the same behavior as DbMap.Update(), but runs in a transaction.
type TypeConverter ¶
type TypeConverter interface { // ToDb converts val to another type. Called before INSERT/UPDATE operations ToDb(val interface{}) (interface{}, error) // FromDb returns a CustomScanner appropriate for this type. This will be used // to hold values returned from SELECT queries. // // In particular the CustomScanner returned should implement a Binder // function appropriate for the Go type you wish to convert the db value to // // If bool==false, then no custom scanner will be used for this field. FromDb(target interface{}) (CustomScanner, bool) }
The TypeConverter interface provides a way to map a value of one type to another type when persisting to, or loading from, a database.
Example use cases: Implement type converter to convert bool types to "y"/"n" strings, or serialize a struct member as a JSON blob.