Documentation ¶
Overview ¶
Use of this source code is governed by a MIT-style license that can be found in the LICENSE file.
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 ReBind(query string, dialect Dialect) string
- type ColumnMap
- type CustomScanner
- type DbMap
- func (m *DbMap) AddTable(i interface{}, name ...string) *TableMap
- func (m *DbMap) AddTableWithName(i interface{}, 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) DropTables() error
- func (m *DbMap) Exec(query string, args ...interface{}) (sql.Result, error)
- func (m *DbMap) Get(dest interface{}, keys ...interface{}) error
- func (m *DbMap) Insert(list ...interface{}) error
- func (m *DbMap) Select(i interface{}, query string, args ...interface{}) error
- func (m *DbMap) TableFor(i interface{}) *TableMap
- func (m *DbMap) TableForType(t reflect.Type) *TableMap
- func (m *DbMap) TraceOff()
- func (m *DbMap) TraceOn(prefix string, logger *log.Logger)
- func (m *DbMap) Update(list ...interface{}) (int64, error)
- type Dialect
- type MySQLDialect
- func (m MySQLDialect) AutoIncrBindValue() string
- func (m MySQLDialect) AutoIncrInsertSuffix(col *ColumnMap) string
- func (m MySQLDialect) AutoIncrStr() string
- func (m MySQLDialect) BindVar(i int) string
- func (m MySQLDialect) CreateTableSuffix() string
- func (m MySQLDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
- func (d MySQLDialect) QuoteField(f string) string
- func (m MySQLDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string
- type NoKeysErr
- type OptimisticLockError
- type PostDeleter
- type PostGetter
- type PostInserter
- type PostUpdater
- 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) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
- func (d PostgresDialect) QuoteField(f string) string
- func (d PostgresDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string
- type PreDeleter
- type PreInserter
- type PreUpdater
- type SqlExecutor
- 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) QuoteField(f string) string
- func (d SqliteDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string
- type TableMap
- 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(dest interface{}, keys ...interface{}) error
- func (t *Transaction) Insert(list ...interface{}) error
- func (t *Transaction) Rollback() error
- func (t *Transaction) Select(dest interface{}, query string, args ...interface{}) error
- func (t *Transaction) Update(list ...interface{}) (int64, error)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
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) 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) SetSqlType ¶
Set the column's sql type. This is a string, such as 'varchar(32)' or 'text', which will be used by CreateTable and nothing else. It is the caller's responsibility to ensure this will map cleanly to the struct
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 Dbx *sqlx.DB // Dialect implementation to use with this map Dialect Dialect // 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), lowercased.
This operation is idempotent. If i's type is already mapped, the existing *TableMap is returned
func (*DbMap) AddTableWithName ¶
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.
Hook functions PreDelete() and/or PostDelete() will be executed before/after the DELETE statement if the interface defines them.
Returns number of rows deleted ¶
Returns an error if SetKeys has not been called on the TableMap or if any interface in the list has not been registered with AddTable
func (*DbMap) DropTables ¶
DropTables iterates through TableMaps registered to this DbMap and executes "drop table" statements against the database for each.
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.
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 or 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, because any interface whose TableMap has an auto-increment PK will have its insert Id bound to the PK struct field,
Hook functions PreInsert() and/or PostInsert() will be executed before/after the INSERT statement if the interface defines them.
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.
Hook function PostGet() will be executed after the SELECT statement if the interface defines them.
Values are returned in one of two ways:
- If i is a struct or a pointer to a struct, returns a slice of pointers to matching rows of type i.
- 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) TableFor ¶
Returns any matching tables for the interface i or nil if not found If i is a slice, then the table is given for the base slice type
func (*DbMap) TableForType ¶
Returns any matching tables for the type t or nil if not found
func (*DbMap) TraceOn ¶
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.
func (*DbMap) Update ¶
Update runs a SQL UPDATE statement for each element in list. List items must be pointers.
Hook functions PreUpdate() and/or PostUpdate() will be executed before/after the UPDATE statement if the interface defines them.
Returns number of rows updated ¶
Returns an error if SetKeys has not been called on the TableMap or if any interface in the list has not been registered with AddTable
type Dialect ¶
type Dialect interface { // 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 AutoIncrBindValue() string AutoIncrInsertSuffix(col *ColumnMap) string // string to append to "create table" statement for vendor specific // table attributes CreateTableSuffix() string InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error) // 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 }
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 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 (m MySQLDialect) AutoIncrBindValue() string
func (MySQLDialect) AutoIncrInsertSuffix ¶
func (m MySQLDialect) AutoIncrInsertSuffix(col *ColumnMap) string
func (MySQLDialect) CreateTableSuffix ¶
func (m MySQLDialect) CreateTableSuffix() string
Returns engine=%s charset=%s based on values stored on struct
func (MySQLDialect) InsertAutoIncr ¶
func (m MySQLDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
func (MySQLDialect) QuoteField ¶
func (d MySQLDialect) QuoteField(f string) string
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 PostDeleter ¶
type PostDeleter interface {
PostDelete(SqlExecutor) error
}
type PostGetter ¶
type PostGetter interface {
PostGet(SqlExecutor) error
}
type PostInserter ¶
type PostInserter interface {
PostInsert(SqlExecutor) error
}
type PostUpdater ¶
type PostUpdater interface {
PostUpdate(SqlExecutor) error
}
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) InsertAutoIncr ¶
func (d PostgresDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
func (PostgresDialect) QuoteField ¶
func (d PostgresDialect) QuoteField(f string) string
type PreDeleter ¶
type PreDeleter interface {
PreDelete(SqlExecutor) error
}
type PreInserter ¶
type PreInserter interface {
PreInsert(SqlExecutor) error
}
type PreUpdater ¶
type PreUpdater interface {
PreUpdate(SqlExecutor) error
}
type SqlExecutor ¶
type SqlExecutor interface { Get(dest interface{}, keys ...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(dest 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 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) QuoteField ¶
func (d SqliteDialect) QuoteField(f string) string
type TableMap ¶
type TableMap struct { // Name of database table. TableName string // Cached capabilities for the struct mapped to this table CanPreInsert bool CanPostInsert bool CanPostGet bool CanPreUpdate bool CanPostUpdate bool CanPreDelete bool CanPostDelete bool // 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.
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 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
Commits the underlying database transaction
func (*Transaction) Delete ¶
func (t *Transaction) Delete(list ...interface{}) (int64, error)
Same behavior as DbMap.Delete(), but runs in a transaction
func (*Transaction) Exec ¶
func (t *Transaction) Exec(query string, args ...interface{}) (sql.Result, error)
Same behavior as DbMap.Exec(), but runs in a transaction
func (*Transaction) Get ¶
func (t *Transaction) Get(dest interface{}, keys ...interface{}) error
Same behavior as DbMap.Get(), but runs in a transaction
func (*Transaction) Insert ¶
func (t *Transaction) Insert(list ...interface{}) error
Same behavior as DbMap.Insert(), but runs in a transaction
func (*Transaction) Rollback ¶
func (t *Transaction) Rollback() error
Rolls back the underlying database transaction
func (*Transaction) Select ¶
func (t *Transaction) Select(dest interface{}, query string, args ...interface{}) error
Same behavior as DbMap.Select(), but runs in a transaction
func (*Transaction) Update ¶
func (t *Transaction) Update(list ...interface{}) (int64, error)
Same behavior as DbMap.Update(), but runs in a transaction