Warning: Structable 3.0.0 has new interfaces, and is incompatible with older versions of Structable.
This library provides basic struct-to-table mapping for Go.
It is based on the Squirrel library.
Structable maps a struct (Record) to a database table via a
structable.Recorder. It is intended to be used as a back-end tool for
building systems like Active Record mappers.
It is designed to satisfy a CRUD-centered record management system, filling the following contract:
type Recorder interface {
Bind(string, Record) Recorder // link struct to table
Insert() error // INSERT just one record
Update() error // UPDATE just one record
Delete() error // DELETE just one record
Exists() (bool, error) // Check for just one record
ExistsWhere(cond interface{}, args ...interface{}) (bool, error)
Load() error // SELECT just one record
LoadWhere(cond interface{}, args ...interface{}) error // Alternate Load()
}Squirrel already provides the ability to perform more complicated operations.
The usual way...
$ go get github.com/technosophos/structable
And import it via:
import "github.com/technosophos/structable"
Structable works by mapping a struct to columns in a database.
To annotate a struct, you do something like this:
type Stool struct {
Id int `stbl:"id, PRIMARY_KEY, AUTO_INCREMENT"`
Legs int `stbl:"number_of_legs"`
Material string `stbl:"material"`
Ignored string // will not be stored. No tag.
}To manage instances of this struct, you do something like this:
stool := new(Stool)
stool.Material = "Wood"
db := getDb() // You're on the hook to do this part.
// Create a new structable.Recorder and tell it to
// bind the given struct as a row in the given table.
r := structable.New(db, "mysql").Bind("test_table", stool)
// This will insert the stool into the test_table.
err := r.Insert()And of course you have Load(), Update(), Delete() and so on.
The target use case for Structable is to use it as a backend for an
Active Record pattern. An example of this can be found in the
structable_test.go file
- MySQL (5.5)
- PostgreSQL (9.3)
It does not...
- Create or manage schemas.
- Guess or enforce table or column names. (You have to tell it how to map.)
- Provide relational mapping.
- Handle bulk operations (use Squirrel for that)
This software is licensed under an MIT-style license. See LICENSE.txt
