truss /trŭs/
n. A rigid framework, as of wooden beams or metal bars, designed to support a structure, such as a roof.
v. to support, strengthen, or stiffen by or as if by a truss.
Truss is a simple golang mysql schema management library that provides the following features:
truss.Connectreturns a*sql.DBfor a production use.truss.Migrateschema management via migration queries (roll forward only).truss.ConnectForTestingreturns testing*sql.DBfor a temp database with the current schema.truss.TestSchemaprovides a snapshot of the current schema for explicit tracking of changes and to quickly view the current state.
Common usage is to use truss in your db package:
Define a simple slice of migration queries in db/migrations.go.
package db
// migrations is an append-only list of all migrations over time.
var migrations = []string{`
CREATE TABLE users (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
type INT NOT NULL,
PRIMARY KEY (id),
INDEX by_name (name)
);`, `
ALTEST TABLE users ADD COLUMN surname VARCHAR(255) AFTER name;
`,
}Ensure the latest schema is applied on startup and in tests in db/db.go.
// Connect returns a database connection and ensures latest migrations are applied
func Connect(uri string) (*sql.DB, error) {
dbc, err := truss.Connect(uri)
if err != nil {
return nil, err
}
err = truss.Migrate(context.Background(), dbc, migrations)
if err != nil {
return nil, err
}
return dbc, nil
}
// ConnectForTesting returns a database connection for a temp database with latest schema.
func ConnectForTesting(t *testing.T) *sql.DB {
return truss.ConnectForTesting(t, migrations...)
}Maintain an explicit snapshot of the latest schema in migrations_test.go.
package db
var update = flag.Bool("update", false, "update schema file")
//go:generate go test -update -run=TestSchema
func TestSchema(t *testing.T) {
truss.TestSchema(t, "schema.sql", *update, migrations...)
}Which will generate the following db/schema.sql file that is checked into the git.
-- Schema generated by truss. DO NOT EDIT.
CREATE TABLE `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`surname` varchar(255),
`type` int(11) NOT NULL,
`created_at` datetime(3) NOT NULL,
PRIMARY KEY (`id`),
KEY `by_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
CREATE TABLE `migrations` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`query_hash` char(64) NOT NULL,
`schema_hash` char(64) NOT NULL,
`created_at` datetime(3) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4