79 lines
1.9 KiB
Go
79 lines
1.9 KiB
Go
package migrations
|
|
|
|
import (
|
|
"io"
|
|
"strings"
|
|
|
|
"github.com/go-pg/pg"
|
|
"github.com/go-pg/pg/orm"
|
|
"github.com/go-pg/pg/types"
|
|
)
|
|
|
|
var tableName = "gopg_migrations"
|
|
|
|
func SetTableName(name string) {
|
|
tableName = name
|
|
}
|
|
|
|
type DB interface {
|
|
Exec(query interface{}, params ...interface{}) (orm.Result, error)
|
|
ExecOne(query interface{}, params ...interface{}) (orm.Result, error)
|
|
Query(model, query interface{}, params ...interface{}) (orm.Result, error)
|
|
QueryOne(model, query interface{}, params ...interface{}) (orm.Result, error)
|
|
|
|
Model(model ...interface{}) *orm.Query
|
|
Select(model interface{}) error
|
|
Insert(model ...interface{}) error
|
|
Update(model ...interface{}) error
|
|
Delete(model interface{}) error
|
|
CreateTable(model interface{}, opt *orm.CreateTableOptions) error
|
|
DropTable(model interface{}, opt *orm.DropTableOptions) error
|
|
|
|
CopyFrom(r io.Reader, query interface{}, params ...interface{}) (orm.Result, error)
|
|
CopyTo(w io.Writer, query interface{}, params ...interface{}) (orm.Result, error)
|
|
|
|
FormatQuery(dst []byte, query string, params ...interface{}) []byte
|
|
}
|
|
|
|
func getTableName() types.ValueAppender {
|
|
return pg.Q(tableName)
|
|
}
|
|
|
|
func Version(db DB) (int64, error) {
|
|
var version int64
|
|
_, err := db.QueryOne(pg.Scan(&version), `
|
|
SELECT version FROM ? ORDER BY id DESC LIMIT 1
|
|
`, getTableName())
|
|
if err != nil {
|
|
if err == pg.ErrNoRows {
|
|
return 0, nil
|
|
}
|
|
return 0, err
|
|
}
|
|
return version, nil
|
|
}
|
|
|
|
func SetVersion(db DB, version int64) error {
|
|
_, err := db.Exec(`
|
|
INSERT INTO ? (version, created_at) VALUES (?, now())
|
|
`, getTableName(), version)
|
|
return err
|
|
}
|
|
|
|
func createTables(db DB) error {
|
|
if ind := strings.IndexByte(tableName, '.'); ind >= 0 {
|
|
_, err := db.Exec(`CREATE SCHEMA IF NOT EXISTS ?`, pg.Q(tableName[:ind]))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
_, err := db.Exec(`
|
|
CREATE TABLE IF NOT EXISTS ? (
|
|
id serial,
|
|
version bigint,
|
|
created_at timestamptz
|
|
)
|
|
`, getTableName())
|
|
return err
|
|
}
|