67 lines
2.0 KiB
Go
67 lines
2.0 KiB
Go
|
package db
|
|||
|
|
|||
|
import (
|
|||
|
"github.com/jmoiron/sqlx"
|
|||
|
_ "github.com/lib/pq"
|
|||
|
"gitlab.com/toby3d/test/internal/model"
|
|||
|
"golang.org/x/xerrors"
|
|||
|
)
|
|||
|
|
|||
|
// demoProducts представляют собой демо-набор продуктов, добавляемые через AutoMigrate для дальнейшего чтения сторами
|
|||
|
var demoProducts = []*model.Product{
|
|||
|
&model.Product{Id: 24, Name: "Banana", Price: 2.49},
|
|||
|
&model.Product{Id: 42, Name: "Apple", Price: 4.99},
|
|||
|
&model.Product{Id: 420, Name: "Bottle of Soda", Price: 10},
|
|||
|
}
|
|||
|
|
|||
|
var ErrDataBaseNotInitialized = xerrors.New("database is not initialized")
|
|||
|
|
|||
|
// Open открывает соединение с PostgreSQL по указанному адресу с параметрами
|
|||
|
func Open(addr string) (*sqlx.DB, error) {
|
|||
|
client, err := sqlx.Connect("postgres", addr)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
if err = client.Ping(); err != nil {
|
|||
|
_ = client.Close()
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
return client, nil
|
|||
|
}
|
|||
|
|
|||
|
// AutoMigrate создаёт таблицы, если они не существуют, для адекватной работы сторов
|
|||
|
func AutoMigrate(db *sqlx.DB) (err error) {
|
|||
|
if db == nil || db.DB == nil {
|
|||
|
return ErrDataBaseNotInitialized
|
|||
|
}
|
|||
|
|
|||
|
if _, err = db.Exec("CREATE TABLE IF NOT EXISTS products (id SERIAL PRIMARY KEY, name TEXT, price FLOAT)"); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
for _, p := range demoProducts {
|
|||
|
if _, err = db.Exec(
|
|||
|
"INSERT INTO products (id, name, price) VALUES ($1, $2, $3)",
|
|||
|
p.GetId(), p.GetName(), p.GetPrice(),
|
|||
|
); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
if _, err = db.Exec("CREATE TABLE IF NOT EXISTS cart (product_id SERIAL PRIMARY KEY, quanity INT)"); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// AutoClean удаляет таблицы созданные AutoMigrate
|
|||
|
func AutoClean(db *sqlx.DB) (err error) {
|
|||
|
if db == nil || db.DB == nil {
|
|||
|
return ErrDataBaseNotInitialized
|
|||
|
}
|
|||
|
|
|||
|
if _, err = db.Exec("DROP TABLE IF EXISTS cart"); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
_, err = db.Exec("DROP TABLE IF EXISTS products")
|
|||
|
return
|
|||
|
}
|