chore: simplify db schema creation (#26693)

This commit is contained in:
andig 2026-01-14 14:43:01 +01:00 • committed by GitHub
parent ad014333b2
commit 45741b1c90
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 35 additions and 47 deletions

View file

@ -22,8 +22,7 @@ type circuitsTestSuite struct {
} }
func (suite *circuitsTestSuite) SetupSuite() { func (suite *circuitsTestSuite) SetupSuite() {
_ = db.NewInstance("sqlite", ":memory:") suite.Require().NoError(db.NewInstance("sqlite", ":memory:"))
config.SetupSchema()
} }
func (suite *circuitsTestSuite) SetupTest() { func (suite *circuitsTestSuite) SetupTest() {

View file

@ -5,6 +5,7 @@ import (
"time" "time"
"github.com/evcc-io/evcc/server/db" "github.com/evcc-io/evcc/server/db"
"gorm.io/gorm"
) )
type meter struct { type meter struct {
@ -16,16 +17,11 @@ type meter struct {
var ErrIncomplete = errors.New("meter profile incomplete") var ErrIncomplete = errors.New("meter profile incomplete")
func init() { func init() {
db.Register(func() error { db.Register(func(db *gorm.DB) error {
return SetupSchema() return db.AutoMigrate(new(meter))
}) })
} }
// SetupSchema is used for testing
func SetupSchema() error {
return db.Instance.AutoMigrate(new(meter))
}
// Persist stores 15min consumption in Wh // Persist stores 15min consumption in Wh
func Persist(ts time.Time, value float64) error { func Persist(ts time.Time, value float64) error {
return db.Instance.Create(meter{ return db.Instance.Create(meter{

View file

@ -13,17 +13,15 @@ type DB struct {
name string name string
} }
var ( var sessions Sessions
sessions Sessions
)
func init() { func init() {
db.Register(func() error { db.Register(func(db *gorm.DB) error {
if err := db.Instance.AutoMigrate(new(Session)); err != nil { if err := db.AutoMigrate(new(Session)); err != nil {
return err return err
} }
return db.Instance.Find(&sessions).Error return db.Find(&sessions).Error
}) })
} }

View file

@ -15,12 +15,10 @@ import (
) )
func TestSqliteTimestamp(t *testing.T) { func TestSqliteTimestamp(t *testing.T) {
require.NoError(t, db.NewInstance("sqlite", ":memory:"))
clock := clock.NewMock() clock := clock.NewMock()
clock.Add(time.Hour) clock.Add(time.Hour)
require.NoError(t, db.NewInstance("sqlite", ":memory:"))
require.NoError(t, metrics.SetupSchema())
metrics.Persist(clock.Now(), 0) metrics.Persist(clock.Now(), 0)
db, err := db.Instance.DB() db, err := db.Instance.DB()
@ -50,14 +48,12 @@ func TestSqliteTimestamp(t *testing.T) {
} }
func TestUpdateHouseholdProfile(t *testing.T) { func TestUpdateHouseholdProfile(t *testing.T) {
clock := clock.NewMock() require.NoError(t, db.NewInstance("sqlite", ":memory:"))
// make sure test data added starting 00:00 local time // make sure test data added starting 00:00 local time
clock := clock.NewMock()
clock.Set(now.With(clock.Now()).BeginningOfDay()) clock.Set(now.With(clock.Now()).BeginningOfDay())
require.NoError(t, db.NewInstance("sqlite", ":memory:"))
require.NoError(t, metrics.SetupSchema())
// 2 days of data // 2 days of data
// day 1: 0 ... 95 // day 1: 0 ... 95
// day 2: 96 ... 181 // day 2: 96 ... 181

View file

@ -6,7 +6,6 @@ import (
"github.com/benbjohnson/clock" "github.com/benbjohnson/clock"
"github.com/evcc-io/evcc/api" "github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/core/metrics"
"github.com/evcc-io/evcc/server/db" "github.com/evcc-io/evcc/server/db"
"github.com/evcc-io/evcc/util" "github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/util/config" "github.com/evcc-io/evcc/util/config"
@ -163,10 +162,9 @@ func TestRequiredBatteryMode(t *testing.T) {
} }
func TestUpdateHomeConsumption(t *testing.T) { func TestUpdateHomeConsumption(t *testing.T) {
clock := clock.NewMock()
require.NoError(t, db.NewInstance("sqlite", ":memory:")) require.NoError(t, db.NewInstance("sqlite", ":memory:"))
require.NoError(t, metrics.SetupSchema())
clock := clock.NewMock()
s := &Site{ s := &Site{
log: util.NewLogger("foo"), log: util.NewLogger("foo"),

View file

@ -4,11 +4,12 @@ import (
"time" "time"
"github.com/evcc-io/evcc/server/db" "github.com/evcc-io/evcc/server/db"
"gorm.io/gorm"
) )
func init() { func init() {
db.Register(func() error { db.Register(func(db *gorm.DB) error {
return db.Instance.AutoMigrate(new(GridSession)) return db.AutoMigrate(new(GridSession))
}) })
} }

View file

@ -18,8 +18,8 @@ type Cache struct {
} }
func init() { func init() {
db.Register(func() error { db.Register(func(db *gorm.DB) error {
return db.Instance.AutoMigrate(new(Cache)) return db.AutoMigrate(new(Cache))
}) })
} }

View file

@ -74,18 +74,18 @@ func New(driver, dsn string) (*gorm.DB, error) {
} }
func NewInstance(driver, dsn string) error { func NewInstance(driver, dsn string) error {
inst, err := New(strings.ToLower(driver), dsn) db, err := New(strings.ToLower(driver), dsn)
if err != nil { if err != nil {
return err return err
} }
Instance = inst Instance = db
mu.Lock() mu.Lock()
defer mu.Unlock() defer mu.Unlock()
for _, f := range registry { for _, f := range registry {
if err := f(); err != nil { if err := f(db); err != nil {
return err return err
} }
} }

View file

@ -1,13 +1,17 @@
package db package db
import "sync" import (
"sync"
"gorm.io/gorm"
)
var ( var (
mu sync.Mutex mu sync.Mutex
registry []func() error registry []func(db *gorm.DB) error
) )
func Register(fun func() error) { func Register(fun func(db *gorm.DB) error) {
mu.Lock() mu.Lock()
defer mu.Unlock() defer mu.Unlock()
registry = append(registry, fun) registry = append(registry, fun)

View file

@ -17,6 +17,7 @@ import (
"github.com/evcc-io/evcc/util" "github.com/evcc-io/evcc/util"
"github.com/samber/lo" "github.com/samber/lo"
"go.yaml.in/yaml/v4" "go.yaml.in/yaml/v4"
"gorm.io/gorm"
) )
var ErrNotFound = errors.New("not found") var ErrNotFound = errors.New("not found")
@ -34,12 +35,12 @@ var (
) )
func init() { func init() {
db.Register(func() error { db.Register(func(db *gorm.DB) error {
if err := db.Instance.AutoMigrate(new(setting)); err != nil { if err := db.AutoMigrate(new(setting)); err != nil {
return err return err
} }
return db.Instance.Find(&settings).Error return db.Find(&settings).Error
}) })
} }

View file

@ -77,16 +77,11 @@ func (d *Config) Delete() error {
} }
func init() { func init() {
db.Register(func() error { db.Register(func(db *gorm.DB) error {
return SetupSchema() return db.AutoMigrate(new(Config))
}) })
} }
// SetupSchema is used for testing
func SetupSchema() error {
return db.Instance.AutoMigrate(new(Config))
}
// NameForID returns a unique config name for the given id // NameForID returns a unique config name for the given id
func NameForID(id int) string { func NameForID(id int) string {
return fmt.Sprintf("db:%d", id) return fmt.Sprintf("db:%d", id)