Simplify all table column selection.
This commit is contained in:
parent
bb18e4d0f7
commit
8e57dcc32f
3 changed files with 43 additions and 15 deletions
|
|
@ -12,7 +12,7 @@ type {{.ToGoStructName}} struct {
|
||||||
{{.ToGoFieldName}} sqlbuilder.NonAliasColumn
|
{{.ToGoFieldName}} sqlbuilder.NonAliasColumn
|
||||||
{{- end}}
|
{{- end}}
|
||||||
|
|
||||||
All []sqlbuilder.Projection
|
AllColumns sqlbuilder.ColumnList
|
||||||
}
|
}
|
||||||
|
|
||||||
var {{.ToGoVarName}} = &{{.ToGoStructName}}{
|
var {{.ToGoVarName}} = &{{.ToGoStructName}}{
|
||||||
|
|
@ -23,7 +23,7 @@ var {{.ToGoVarName}} = &{{.ToGoStructName}}{
|
||||||
{{.ToGoFieldName}}: {{.ToGoVarName}},
|
{{.ToGoFieldName}}: {{.ToGoVarName}},
|
||||||
{{- end}}
|
{{- end}}
|
||||||
|
|
||||||
All: []sqlbuilder.Projection{ {{.ToGoColumnFieldList ", "}} },
|
AllColumns: sqlbuilder.ColumnList{ {{.ToGoColumnFieldList ", "}} },
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,33 @@ type Projection interface {
|
||||||
SerializeSqlForColumnList(out *bytes.Buffer) error
|
SerializeSqlForColumnList(out *bytes.Buffer) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ColumnList []NonAliasColumn
|
||||||
|
|
||||||
|
func (cl ColumnList) SerializeSql(out *bytes.Buffer) error {
|
||||||
|
for i, column := range cl {
|
||||||
|
column.SerializeSql(out)
|
||||||
|
|
||||||
|
if i != len(cl)-1 {
|
||||||
|
out.WriteString(", ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cl ColumnList) isProjectionType() {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cl ColumnList) SerializeSqlForColumnList(out *bytes.Buffer) error {
|
||||||
|
for i, column := range cl {
|
||||||
|
column.SerializeSqlForColumnList(out)
|
||||||
|
|
||||||
|
if i != len(cl)-1 {
|
||||||
|
out.WriteString(", ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Boiler plates ...
|
// Boiler plates ...
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ func TestGenerateModel(t *testing.T) {
|
||||||
|
|
||||||
func TestSelect_ScanToStruct(t *testing.T) {
|
func TestSelect_ScanToStruct(t *testing.T) {
|
||||||
actor := model.Actor{}
|
actor := model.Actor{}
|
||||||
err := Actor.Select(Actor.All...).Execute(db, &actor)
|
err := Actor.Select(Actor.AllColumns).Execute(db, &actor)
|
||||||
|
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
|
|
||||||
|
|
@ -75,13 +75,12 @@ func TestSelect_ScanToStruct(t *testing.T) {
|
||||||
func TestSelect_ScanToSlice(t *testing.T) {
|
func TestSelect_ScanToSlice(t *testing.T) {
|
||||||
customers := []model.Customer{}
|
customers := []model.Customer{}
|
||||||
|
|
||||||
query := Customer.Select(Customer.All...)
|
query := Customer.Select(Customer.AllColumns)
|
||||||
|
|
||||||
queryStr, err := query.String()
|
queryStr, err := query.String()
|
||||||
|
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
assert.Equal(t, queryStr, `SELECT customer.customer_id AS "customer.customer_id", customer.store_id AS "customer.store_id", customer.first_name AS "customer.first_name", customer.last_name AS "customer.last_name", customer.email AS "customer.email", customer.address_id AS "customer.address_id", customer.activebool AS "customer.activebool", customer.create_date AS "customer.create_date", customer.last_update AS "customer.last_update", customer.active AS "customer.active" FROM dvds.customer`)
|
assert.Equal(t, queryStr, `SELECT customer.customer_id AS "customer.customer_id", customer.store_id AS "customer.store_id", customer.first_name AS "customer.first_name", customer.last_name AS "customer.last_name", customer.email AS "customer.email", customer.address_id AS "customer.address_id", customer.activebool AS "customer.activebool", customer.create_date AS "customer.create_date", customer.last_update AS "customer.last_update", customer.active AS "customer.active" FROM dvds.customer`)
|
||||||
|
|
||||||
err = query.Execute(db, &customers)
|
err = query.Execute(db, &customers)
|
||||||
|
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
|
|
@ -134,19 +133,18 @@ func TestSelect_ScanToSlice(t *testing.T) {
|
||||||
|
|
||||||
func TestJoinQueryStruct(t *testing.T) {
|
func TestJoinQueryStruct(t *testing.T) {
|
||||||
|
|
||||||
//filmActor := model.FilmActor{}
|
|
||||||
allFilmActorColumns := append(append(append(FilmActor.All, Film.All...), Language.All...), Actor.All...)
|
|
||||||
query := FilmActor.
|
query := FilmActor.
|
||||||
InnerJoinOn(Actor, sqlbuilder.Eq(FilmActor.ActorID, Actor.ActorID)).
|
InnerJoinOn(Actor, sqlbuilder.Eq(FilmActor.ActorID, Actor.ActorID)).
|
||||||
InnerJoinOn(Film, sqlbuilder.Eq(FilmActor.FilmID, Film.FilmID)).
|
InnerJoinOn(Film, sqlbuilder.Eq(FilmActor.FilmID, Film.FilmID)).
|
||||||
InnerJoinOn(Language, sqlbuilder.Eq(Film.LanguageID, Language.LanguageID)).
|
InnerJoinOn(Language, sqlbuilder.Eq(Film.LanguageID, Language.LanguageID)).
|
||||||
Select(allFilmActorColumns...).
|
Select(FilmActor.AllColumns, Film.AllColumns, Language.AllColumns, Actor.AllColumns).
|
||||||
Where(sqlbuilder.And(sqlbuilder.Gte(FilmActor.ActorID, sqlbuilder.Literal(1)), sqlbuilder.Lte(FilmActor.ActorID, sqlbuilder.Literal(2))))
|
Where(sqlbuilder.And(sqlbuilder.Gte(FilmActor.ActorID, sqlbuilder.Literal(1)), sqlbuilder.Lte(FilmActor.ActorID, sqlbuilder.Literal(2))))
|
||||||
|
|
||||||
queryStr, err := query.String()
|
queryStr, err := query.String()
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
|
assert.Equal(t, queryStr, `SELECT film_actor.actor_id AS "film_actor.actor_id", film_actor.film_id AS "film_actor.film_id", film_actor.last_update AS "film_actor.last_update",film.film_id AS "film.film_id", film.title AS "film.title", film.description AS "film.description", film.release_year AS "film.release_year", film.language_id AS "film.language_id", film.rental_duration AS "film.rental_duration", film.rental_rate AS "film.rental_rate", film.length AS "film.length", film.replacement_cost AS "film.replacement_cost", film.rating AS "film.rating", film.last_update AS "film.last_update", film.special_features AS "film.special_features", film.fulltext AS "film.fulltext",language.language_id AS "language.language_id", language.name AS "language.name", language.last_update AS "language.last_update",actor.actor_id AS "actor.actor_id", actor.first_name AS "actor.first_name", actor.last_name AS "actor.last_name", actor.last_update AS "actor.last_update" FROM dvds.film_actor JOIN dvds.actor ON film_actor.actor_id = actor.actor_id JOIN dvds.film ON film_actor.film_id = film.film_id JOIN dvds.language ON film.language_id = language.language_id WHERE (film_actor.actor_id>=1 AND film_actor.actor_id<=2)`)
|
||||||
|
|
||||||
fmt.Println(queryStr)
|
//fmt.Println(queryStr)
|
||||||
|
|
||||||
filmActor := []model.FilmActor{}
|
filmActor := []model.FilmActor{}
|
||||||
|
|
||||||
|
|
@ -168,14 +166,17 @@ func TestJoinQuerySlice(t *testing.T) {
|
||||||
limit := 15
|
limit := 15
|
||||||
|
|
||||||
query := Film.InnerJoinOn(Language, sqlbuilder.Eq(Film.LanguageID, Language.LanguageID)).
|
query := Film.InnerJoinOn(Language, sqlbuilder.Eq(Film.LanguageID, Language.LanguageID)).
|
||||||
Select(append(Language.All, Film.All...)...).
|
Select(Language.AllColumns, Film.AllColumns).
|
||||||
Limit(15)
|
Limit(15)
|
||||||
|
|
||||||
queryStr, _ := query.String()
|
queryStr, err := query.String()
|
||||||
|
|
||||||
fmt.Println(queryStr)
|
assert.NilError(t, err)
|
||||||
|
assert.Equal(t, queryStr, `SELECT language.language_id AS "language.language_id", language.name AS "language.name", language.last_update AS "language.last_update",film.film_id AS "film.film_id", film.title AS "film.title", film.description AS "film.description", film.release_year AS "film.release_year", film.language_id AS "film.language_id", film.rental_duration AS "film.rental_duration", film.rental_rate AS "film.rental_rate", film.length AS "film.length", film.replacement_cost AS "film.replacement_cost", film.rating AS "film.rating", film.last_update AS "film.last_update", film.special_features AS "film.special_features", film.fulltext AS "film.fulltext" FROM dvds.film JOIN dvds.language ON film.language_id = language.language_id LIMIT 15`)
|
||||||
|
|
||||||
err := query.Execute(db, &filmsPerLanguage)
|
//fmt.Println(queryStr)
|
||||||
|
|
||||||
|
err = query.Execute(db, &filmsPerLanguage)
|
||||||
|
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
|
|
||||||
|
|
@ -205,7 +206,7 @@ func TestJoinQuerySliceWithPtrs(t *testing.T) {
|
||||||
limit := int64(3)
|
limit := int64(3)
|
||||||
|
|
||||||
query := Film.InnerJoinOn(Language, sqlbuilder.Eq(Film.LanguageID, Language.LanguageID)).
|
query := Film.InnerJoinOn(Language, sqlbuilder.Eq(Film.LanguageID, Language.LanguageID)).
|
||||||
Select(append(Language.All, Film.All...)...).
|
Select(Language.AllColumns, Film.AllColumns).
|
||||||
Limit(limit)
|
Limit(limit)
|
||||||
|
|
||||||
filmsPerLanguageWithPtrs := []*FilmsPerLanguage{}
|
filmsPerLanguageWithPtrs := []*FilmsPerLanguage{}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue