2019-03-03 17:54:43 +01:00
package tests
import (
"fmt"
2019-05-12 18:15:23 +02:00
. "github.com/sub0zero/go-sqlbuilder/sqlbuilder"
2019-04-07 10:05:41 +02:00
"github.com/sub0zero/go-sqlbuilder/tests/.test_files/dvd_rental/dvds/model"
. "github.com/sub0zero/go-sqlbuilder/tests/.test_files/dvd_rental/dvds/table"
2019-03-03 17:54:43 +01:00
"gotest.tools/assert"
"testing"
)
2019-03-14 09:18:23 +01:00
func TestSelect_ScanToStruct ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
SELECT 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 . actor
WHERE actor . actor_id = 1
ORDER BY actor . actor_id ASC ;
`
2019-05-08 12:49:36 +02:00
query := Actor .
SELECT ( Actor . AllColumns ) .
2019-05-12 18:15:23 +02:00
WHERE ( Actor . ActorID . EqL ( 1 ) ) .
2019-05-08 12:49:36 +02:00
ORDER_BY ( Actor . ActorID . ASC ( ) )
2019-04-03 11:03:07 +02:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql , 1 )
2019-04-03 11:03:07 +02:00
2019-05-12 18:15:23 +02:00
actor := model . Actor { }
err := query . Query ( db , & actor )
2019-03-14 09:18:23 +01:00
assert . NilError ( t , err )
2019-03-05 18:55:47 +01:00
2019-03-14 09:18:23 +01:00
expectedActor := model . Actor {
ActorID : 1 ,
FirstName : "Penelope" ,
LastName : "Guiness" ,
2019-04-03 14:18:58 +02:00
LastUpdate : * timeWithoutTimeZone ( "2013-05-26 14:47:57.62" , 2 ) ,
2019-03-14 09:18:23 +01:00
}
assert . DeepEqual ( t , actor , expectedActor )
}
2019-05-05 12:37:23 +02:00
func TestClassicSelect ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
SELECT payment . payment_id AS "payment.payment_id" ,
payment . customer_id AS "payment.customer_id" ,
payment . staff_id AS "payment.staff_id" ,
payment . rental_id AS "payment.rental_id" ,
payment . amount AS "payment.amount" ,
payment . payment_date AS "payment.payment_date" ,
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 . payment
JOIN dvds . customer ON payment . customer_id = customer . customer_id
ORDER BY payment . payment_id ASC
LIMIT 30 ;
`
query := SELECT ( Payment . AllColumns , Customer . AllColumns ) .
2019-05-05 12:37:23 +02:00
FROM ( Payment . INNER_JOIN ( Customer , Payment . CustomerID . Eq ( Customer . CustomerID ) ) ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Payment . PaymentID . ASC ( ) ) .
2019-05-05 12:37:23 +02:00
LIMIT ( 30 )
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql , int64 ( 30 ) )
2019-05-05 12:37:23 +02:00
dest := [ ] model . Payment { }
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & dest )
2019-05-05 12:37:23 +02:00
assert . NilError ( t , err )
2019-05-12 18:15:23 +02:00
assert . Equal ( t , len ( dest ) , 30 )
//spew.Dump(dest)
2019-05-05 12:37:23 +02:00
}
2019-03-14 09:18:23 +01:00
func TestSelect_ScanToSlice ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
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
ORDER BY customer . customer_id ASC ;
`
2019-03-05 18:55:47 +01:00
customers := [ ] model . Customer { }
2019-05-05 18:03:30 +02:00
query := Customer . SELECT ( Customer . AllColumns ) . ORDER_BY ( Customer . CustomerID . ASC ( ) )
2019-03-05 18:55:47 +01:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql )
2019-03-05 18:55:47 +01:00
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & customers )
2019-03-05 18:55:47 +01:00
assert . NilError ( t , err )
2019-03-14 09:18:23 +01:00
assert . Equal ( t , len ( customers ) , 599 )
2019-03-03 17:54:43 +01:00
2019-03-14 09:18:23 +01:00
assert . DeepEqual ( t , customer0 , customers [ 0 ] )
assert . DeepEqual ( t , customer1 , customers [ 1 ] )
assert . DeepEqual ( t , lastCustomer , customers [ 598 ] )
2019-03-03 17:54:43 +01:00
}
2019-03-09 14:20:44 +01:00
2019-05-05 12:37:23 +02:00
func TestSelectAndUnionInProjection ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
SELECT payment . payment_id AS "payment.payment_id" ,
(
SELECT customer . customer_id AS "customer.customer_id"
FROM dvds . customer
LIMIT 1
) ,
(
(
(
SELECT payment . payment_id AS "payment.payment_id"
FROM dvds . payment
LIMIT 1
OFFSET 10
)
UNION
(
SELECT payment . payment_id AS "payment.payment_id"
FROM dvds . payment
LIMIT 1
OFFSET 2
)
)
LIMIT 1
)
FROM dvds . payment
LIMIT 12 ;
`
2019-05-05 12:37:23 +02:00
query := Payment .
SELECT (
Payment . PaymentID ,
Customer . SELECT ( Customer . CustomerID ) . LIMIT ( 1 ) ,
2019-05-12 18:15:23 +02:00
UNION (
Payment . SELECT ( Payment . PaymentID ) . LIMIT ( 1 ) . OFFSET ( 10 ) ,
Payment . SELECT ( Payment . PaymentID ) . LIMIT ( 1 ) . OFFSET ( 2 ) ,
) . LIMIT ( 1 ) ,
2019-05-05 12:37:23 +02:00
) .
LIMIT ( 12 )
2019-05-12 18:15:23 +02:00
fmt . Println ( query . Sql ( ) )
assertQuery ( t , query , expectedSql , int64 ( 1 ) , int64 ( 1 ) , int64 ( 10 ) , int64 ( 1 ) , int64 ( 2 ) , int64 ( 1 ) , int64 ( 12 ) )
2019-05-05 12:37:23 +02:00
}
2019-04-03 11:03:07 +02:00
//func TestJoinQueryStruct(t *testing.T) {
//
// query := FilmActor.
// INNER_JOIN(Actor, FilmActor.ActorID.Eq(Actor.ActorID)).
// INNER_JOIN(Film, FilmActor.FilmID.Eq(Film.FilmID)).
// INNER_JOIN(Language, Film.LanguageID.Eq(Language.LanguageID)).
// SELECT(FilmActor.AllColumns, Film.AllColumns, Language.AllColumns, Actor.AllColumns).
2019-05-06 12:42:15 +02:00
// WHERE(FilmActor.ActorID.GtEq(1).AND(FilmActor.ActorID.LteLiteral(2)))
2019-04-03 11:03:07 +02:00
//
2019-04-29 14:39:48 +02:00
// queryStr, args, err := query.Sql()
2019-04-03 11:03:07 +02:00
// 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)
//
// filmActor := []model.FilmActor{}
//
// err = query.Execute(db, &filmActor)
//
// assert.NilError(t, err)
//
// //fmt.Println("ACTORS: --------------------")
// //spew.Dump(filmActor)
//}
2019-03-14 09:18:23 +01:00
func TestJoinQuerySlice ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
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
WHERE film . rating = ' NC - 17 '
LIMIT 15 ;
`
2019-03-14 09:18:23 +01:00
type FilmsPerLanguage struct {
Language * model . Language
2019-04-03 19:21:46 +02:00
Film [ ] model . Film
2019-03-14 09:18:23 +01:00
}
filmsPerLanguage := [ ] FilmsPerLanguage { }
limit := 15
2019-04-03 11:03:07 +02:00
query := Film .
INNER_JOIN ( Language , Film . LanguageID . Eq ( Language . LanguageID ) ) .
SELECT ( Language . AllColumns , Film . AllColumns ) .
2019-05-06 12:42:15 +02:00
WHERE ( Film . Rating . EqString ( string ( model . MpaaRating_NC17 ) ) ) .
2019-04-29 14:39:48 +02:00
LIMIT ( 15 )
2019-03-14 09:18:23 +01:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql , string ( model . MpaaRating_NC17 ) , int64 ( 15 ) )
2019-03-15 21:25:24 +01:00
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & filmsPerLanguage )
2019-03-14 09:18:23 +01:00
assert . NilError ( t , err )
assert . Equal ( t , len ( filmsPerLanguage ) , 1 )
2019-04-03 19:21:46 +02:00
assert . Equal ( t , len ( filmsPerLanguage [ 0 ] . Film ) , limit )
englishFilms := filmsPerLanguage [ 0 ]
assert . Equal ( t , * englishFilms . Film [ 0 ] . Rating , model . MpaaRating_NC17 )
2019-03-14 09:18:23 +01:00
filmsPerLanguageWithPtrs := [ ] * FilmsPerLanguage { }
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & filmsPerLanguageWithPtrs )
2019-03-14 09:18:23 +01:00
assert . NilError ( t , err )
assert . Equal ( t , len ( filmsPerLanguage ) , 1 )
2019-04-03 19:21:46 +02:00
assert . Equal ( t , len ( filmsPerLanguage [ 0 ] . Film ) , limit )
2019-03-14 09:18:23 +01:00
}
func TestJoinQuerySliceWithPtrs ( t * testing . T ) {
type FilmsPerLanguage struct {
Language model . Language
2019-03-30 10:17:32 +01:00
Film * [ ] * model . Film
2019-03-14 09:18:23 +01:00
}
limit := int64 ( 3 )
2019-04-03 11:03:07 +02:00
query := Film . INNER_JOIN ( Language , Film . LanguageID . Eq ( Language . LanguageID ) ) .
SELECT ( Language . AllColumns , Film . AllColumns ) .
2019-04-29 14:39:48 +02:00
LIMIT ( limit )
2019-03-14 09:18:23 +01:00
filmsPerLanguageWithPtrs := [ ] * FilmsPerLanguage { }
2019-04-20 19:49:29 +02:00
err := query . Query ( db , & filmsPerLanguageWithPtrs )
2019-03-14 09:18:23 +01:00
assert . NilError ( t , err )
assert . Equal ( t , len ( filmsPerLanguageWithPtrs ) , 1 )
2019-03-30 10:17:32 +01:00
assert . Equal ( t , len ( * filmsPerLanguageWithPtrs [ 0 ] . Film ) , int ( limit ) )
2019-03-14 09:18:23 +01:00
}
2019-03-15 21:55:43 +01:00
func TestSelect_WithoutUniqueColumnSelected ( t * testing . T ) {
2019-04-03 11:03:07 +02:00
query := Customer . SELECT ( Customer . FirstName , Customer . LastName , Customer . Email )
2019-03-15 21:55:43 +01:00
customers := [ ] model . Customer { }
2019-04-20 19:49:29 +02:00
err := query . Query ( db , & customers )
2019-03-15 21:55:43 +01:00
assert . NilError ( t , err )
//spew.Dump(customers)
assert . Equal ( t , len ( customers ) , 599 )
}
func TestSelectOrderByAscDesc ( t * testing . T ) {
customersAsc := [ ] model . Customer { }
2019-04-03 11:03:07 +02:00
err := Customer . SELECT ( Customer . CustomerID , Customer . FirstName , Customer . LastName ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Customer . FirstName . ASC ( ) ) .
2019-04-20 19:49:29 +02:00
Query ( db , & customersAsc )
2019-03-15 21:55:43 +01:00
assert . NilError ( t , err )
firstCustomerAsc := customersAsc [ 0 ]
lastCustomerAsc := customersAsc [ len ( customersAsc ) - 1 ]
customersDesc := [ ] model . Customer { }
2019-04-03 11:03:07 +02:00
err = Customer . SELECT ( Customer . CustomerID , Customer . FirstName , Customer . LastName ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Customer . FirstName . DESC ( ) ) .
2019-04-20 19:49:29 +02:00
Query ( db , & customersDesc )
2019-03-15 21:55:43 +01:00
assert . NilError ( t , err )
firstCustomerDesc := customersDesc [ 0 ]
lastCustomerDesc := customersDesc [ len ( customersAsc ) - 1 ]
assert . DeepEqual ( t , firstCustomerAsc , lastCustomerDesc )
assert . DeepEqual ( t , lastCustomerAsc , firstCustomerDesc )
customersAscDesc := [ ] model . Customer { }
2019-04-03 11:03:07 +02:00
err = Customer . SELECT ( Customer . CustomerID , Customer . FirstName , Customer . LastName ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Customer . FirstName . ASC ( ) , Customer . LastName . DESC ( ) ) .
2019-04-20 19:49:29 +02:00
Query ( db , & customersAscDesc )
2019-03-15 21:55:43 +01:00
assert . NilError ( t , err )
customerAscDesc326 := model . Customer {
CustomerID : 67 ,
FirstName : "Kelly" ,
LastName : "Torres" ,
}
customerAscDesc327 := model . Customer {
CustomerID : 546 ,
FirstName : "Kelly" ,
LastName : "Knott" ,
}
assert . DeepEqual ( t , customerAscDesc326 , customersAscDesc [ 326 ] )
assert . DeepEqual ( t , customerAscDesc327 , customersAscDesc [ 327 ] )
}
2019-03-16 14:13:35 +01:00
func TestSelectFullJoin ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
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" ,
address . address_id AS "address.address_id" ,
address . address AS "address.address" ,
address . address2 AS "address.address2" ,
address . district AS "address.district" ,
address . city_id AS "address.city_id" ,
address . postal_code AS "address.postal_code" ,
address . phone AS "address.phone" ,
address . last_update AS "address.last_update"
FROM dvds . customer
FULL JOIN dvds . address ON customer . address_id = address . address_id
ORDER BY customer . customer_id ASC ;
`
2019-03-16 14:13:35 +01:00
query := Customer .
2019-04-03 11:03:07 +02:00
FULL_JOIN ( Address , Customer . AddressID . Eq ( Address . AddressID ) ) .
SELECT ( Customer . AllColumns , Address . AllColumns ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Customer . CustomerID . ASC ( ) )
2019-03-16 14:13:35 +01:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql )
2019-03-16 14:13:35 +01:00
allCustomersAndAddress := [ ] struct {
Address * model . Address
Customer * model . Customer
} { }
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & allCustomersAndAddress )
2019-03-16 14:13:35 +01:00
assert . NilError ( t , err )
assert . Equal ( t , len ( allCustomersAndAddress ) , 603 )
assert . DeepEqual ( t , allCustomersAndAddress [ 0 ] . Customer , & customer0 )
assert . Assert ( t , allCustomersAndAddress [ 0 ] . Address != nil )
lastCustomerAddress := allCustomersAndAddress [ len ( allCustomersAndAddress ) - 1 ]
assert . Assert ( t , lastCustomerAddress . Customer == nil )
assert . Assert ( t , lastCustomerAddress . Address != nil )
}
func TestSelectFullCrossJoin ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
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" ,
address . address_id AS "address.address_id" ,
address . address AS "address.address" ,
address . address2 AS "address.address2" ,
address . district AS "address.district" ,
address . city_id AS "address.city_id" ,
address . postal_code AS "address.postal_code" ,
address . phone AS "address.phone" ,
address . last_update AS "address.last_update"
FROM dvds . customer
CROSS JOIN dvds . address
ORDER BY customer . customer_id ASC
LIMIT 1000 ;
`
2019-03-16 14:13:35 +01:00
query := Customer .
2019-05-05 12:37:23 +02:00
CROSS_JOIN ( Address ) .
2019-04-03 11:03:07 +02:00
SELECT ( Customer . AllColumns , Address . AllColumns ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Customer . CustomerID . ASC ( ) ) .
2019-04-29 14:39:48 +02:00
LIMIT ( 1000 )
2019-03-16 14:13:35 +01:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql , int64 ( 1000 ) )
2019-03-16 14:13:35 +01:00
customerAddresCrosJoined := [ ] model . Customer { }
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & customerAddresCrosJoined )
2019-03-16 14:13:35 +01:00
2019-03-17 10:21:44 +01:00
assert . Equal ( t , len ( customerAddresCrosJoined ) , 1000 )
2019-03-16 14:13:35 +01:00
assert . NilError ( t , err )
}
2019-03-16 20:41:06 +01:00
func TestSelectSelfJoin ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
SELECT f1 . film_id AS "f1.film_id" ,
f1 . title AS "f1.title" ,
f1 . description AS "f1.description" ,
f1 . release_year AS "f1.release_year" ,
f1 . language_id AS "f1.language_id" ,
f1 . rental_duration AS "f1.rental_duration" ,
f1 . rental_rate AS "f1.rental_rate" ,
f1 . length AS "f1.length" ,
f1 . replacement_cost AS "f1.replacement_cost" ,
f1 . rating AS "f1.rating" ,
f1 . last_update AS "f1.last_update" ,
f1 . special_features AS "f1.special_features" ,
f1 . fulltext AS "f1.fulltext" ,
f2 . film_id AS "f2.film_id" ,
f2 . title AS "f2.title" ,
f2 . description AS "f2.description" ,
f2 . release_year AS "f2.release_year" ,
f2 . language_id AS "f2.language_id" ,
f2 . rental_duration AS "f2.rental_duration" ,
f2 . rental_rate AS "f2.rental_rate" ,
f2 . length AS "f2.length" ,
f2 . replacement_cost AS "f2.replacement_cost" ,
f2 . rating AS "f2.rating" ,
f2 . last_update AS "f2.last_update" ,
f2 . special_features AS "f2.special_features" ,
f2 . fulltext AS "f2.fulltext"
FROM dvds . film AS f1
JOIN dvds . film AS f2 ON ( f1 . film_id != f2 . film_id AND f1 . length = f2 . length )
ORDER BY f1 . film_id ASC
LIMIT 100 ;
`
2019-05-05 18:03:30 +02:00
f1 := Film . AS ( "f1" )
2019-03-16 20:41:06 +01:00
2019-05-05 18:03:30 +02:00
f2 := Film . AS ( "f2" )
2019-03-16 20:41:06 +01:00
query := f1 .
2019-05-06 12:42:15 +02:00
INNER_JOIN ( f2 , f1 . FilmID . NotEq ( f2 . FilmID ) . AND ( f1 . Length . Eq ( f2 . Length ) ) ) .
2019-04-03 11:03:07 +02:00
SELECT ( f1 . AllColumns , f2 . AllColumns ) .
2019-05-12 18:15:23 +02:00
ORDER_BY ( f1 . FilmID . ASC ( ) ) .
LIMIT ( 100 )
2019-03-16 20:41:06 +01:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql , int64 ( 100 ) )
2019-03-16 20:41:06 +01:00
type F1 model . Film
type F2 model . Film
theSameLengthFilms := [ ] struct {
F1 F1
F2 F2
} { }
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & theSameLengthFilms )
2019-03-16 20:41:06 +01:00
assert . NilError ( t , err )
2019-05-12 18:15:23 +02:00
assert . Equal ( t , len ( theSameLengthFilms ) , 100 )
2019-03-16 20:41:06 +01:00
}
2019-03-17 20:41:03 +01:00
func TestSelectAliasColumn ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
SELECT f1 . title AS "thesame_length_films.title1" ,
f2 . title AS "thesame_length_films.title2" ,
f1 . length AS "thesame_length_films.length"
FROM dvds . film AS f1
JOIN dvds . film AS f2 ON ( f1 . film_id != f2 . film_id AND f1 . length = f2 . length )
ORDER BY f1 . length ASC , f1 . title ASC , f2 . title ASC
LIMIT 1000 ;
`
2019-05-05 18:03:30 +02:00
f1 := Film . AS ( "f1" )
f2 := Film . AS ( "f2" )
2019-03-17 20:41:03 +01:00
query := f1 .
2019-05-06 12:42:15 +02:00
INNER_JOIN ( f2 , f1 . FilmID . NotEq ( f2 . FilmID ) . AND ( f1 . Length . Eq ( f2 . Length ) ) ) .
2019-05-05 18:03:30 +02:00
SELECT ( f1 . Title . AS ( "thesame_length_films.title1" ) ,
f2 . Title . AS ( "thesame_length_films.title2" ) ,
f1 . Length . AS ( "thesame_length_films.length" ) ) .
ORDER_BY ( f1 . Length . ASC ( ) , f1 . Title . ASC ( ) , f2 . Title . ASC ( ) ) .
2019-04-29 14:39:48 +02:00
LIMIT ( 1000 )
2019-03-17 20:41:03 +01:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql , int64 ( 1000 ) )
2019-03-17 20:41:03 +01:00
2019-05-12 18:15:23 +02:00
type thesameLengthFilms struct {
Title1 string
Title2 string
Length int16
}
2019-03-17 20:41:03 +01:00
films := [ ] thesameLengthFilms { }
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & films )
2019-03-17 20:41:03 +01:00
assert . NilError ( t , err )
//spew.Dump(films)
assert . Equal ( t , len ( films ) , 1000 )
2019-03-30 10:17:32 +01:00
assert . DeepEqual ( t , films [ 0 ] , thesameLengthFilms { "Alien Center" , "Iron Moon" , 46 } )
}
type Manager staff
type staff struct {
StaffID int32 ` sql:"unique" `
FirstName string
LastName string
//Address *model.Address
//Email *string
//StoreID int16
//Active bool
//Username string
//Password *string
//LastUpdate time.Time
* Manager //`sqlbuilder:"manager"`
}
func TestSelectSelfReferenceType ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
SELECT DISTINCT staff . staff_id AS "staff.staff_id" ,
staff . first_name AS "staff.first_name" ,
staff . last_name AS "staff.last_name" ,
address . address_id AS "address.address_id" ,
address . address AS "address.address" ,
address . address2 AS "address.address2" ,
address . district AS "address.district" ,
address . city_id AS "address.city_id" ,
address . postal_code AS "address.postal_code" ,
address . phone AS "address.phone" ,
address . last_update AS "address.last_update" ,
manager . staff_id AS "manager.staff_id" ,
manager . first_name AS "manager.first_name"
FROM dvds . staff
JOIN dvds . address ON staff . address_id = address . address_id
JOIN dvds . staff AS manager ON staff . staff_id = manager . staff_id ;
`
2019-05-05 18:03:30 +02:00
manager := Staff . AS ( "manager" )
2019-03-30 10:17:32 +01:00
query := Staff .
2019-04-03 11:03:07 +02:00
INNER_JOIN ( Address , Staff . AddressID . Eq ( Address . AddressID ) ) .
INNER_JOIN ( manager , Staff . StaffID . Eq ( manager . StaffID ) ) .
2019-05-12 18:15:23 +02:00
SELECT ( Staff . StaffID , Staff . FirstName , Staff . LastName , Address . AllColumns , manager . StaffID , manager . FirstName ) .
DISTINCT ( )
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql )
2019-03-30 10:17:32 +01:00
staffs := [ ] staff { }
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & staffs )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
2019-05-12 18:15:23 +02:00
fmt . Println ( query . DebugSql ( ) )
2019-03-30 10:17:32 +01:00
//spew.Dump(staffs)
}
func TestSubQuery ( t * testing . T ) {
2019-04-03 11:03:07 +02:00
//selectStmtTable := Actor.SELECT(Actor.FirstName, Actor.LastName).AsTable("table_expression")
2019-03-30 10:17:32 +01:00
//
2019-04-03 11:03:07 +02:00
//query := selectStmtTable.SELECT(
2019-05-05 18:03:30 +02:00
// selectStmtTable.RefStringColumn(Actor.FirstName).AS("nesto"),
// selectStmtTable.RefIntColumnName("actor.last_name").AS("nesto2"),
2019-03-30 10:17:32 +01:00
// )
//
2019-04-29 14:39:48 +02:00
//queryStr, args, err := query.Sql()
2019-03-30 10:17:32 +01:00
//
//assert.NilError(t, err)
//
//fmt.Println(queryStr)
2019-04-03 11:03:07 +02:00
//
2019-05-12 18:15:23 +02:00
//avrgCustomer := NumExp(Customer.SELECT(Customer.LastName).LIMIT(1))
2019-03-30 10:17:32 +01:00
//
//Customer.
2019-04-03 11:03:07 +02:00
// INNER_JOIN(selectStmtTable, Customer.LastName.Eq(selectStmtTable.RefStringColumn(Actor.FirstName))).
// SELECT(Customer.AllColumns, selectStmtTable.RefIntColumnName("first_name")).
2019-04-14 17:55:10 +02:00
// WHERE(Actor.LastName.Neq(avrgCustomer))
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
expectedQuery := `
SELECT 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" ,
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" ,
films . "film.title" AS "film.title" ,
films . "film.rating" AS "film.rating"
FROM dvds . actor
JOIN dvds . film_actor ON actor . actor_id = film_actor . film_id
JOIN (
SELECT film . film_id AS "film.film_id" ,
film . title AS "film.title" ,
film . rating AS "film.rating"
FROM dvds . film
WHERE film . rating = 'R'
) AS films ON film_actor . film_id = films . "film.film_id" ;
`
2019-04-03 11:03:07 +02:00
rFilmsOnly := Film . SELECT ( Film . FilmID , Film . Title , Film . Rating ) .
2019-05-06 12:42:15 +02:00
WHERE ( Film . Rating . EqString ( "R" ) ) .
2019-03-30 10:17:32 +01:00
AsTable ( "films" )
2019-04-03 11:03:07 +02:00
query := Actor . INNER_JOIN ( FilmActor , Actor . ActorID . Eq ( FilmActor . FilmID ) ) .
INNER_JOIN ( rFilmsOnly , FilmActor . FilmID . Eq ( rFilmsOnly . RefIntColumn ( Film . FilmID ) ) ) .
SELECT (
2019-03-30 10:17:32 +01:00
Actor . AllColumns ,
FilmActor . AllColumns ,
2019-05-05 18:03:30 +02:00
rFilmsOnly . RefStringColumn ( Film . Title ) . AS ( "film.title" ) ,
rFilmsOnly . RefStringColumn ( Film . Rating ) . AS ( "film.rating" ) ,
2019-03-30 10:17:32 +01:00
)
2019-05-12 18:15:23 +02:00
fmt . Println ( query . Sql ( ) )
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedQuery , "R" )
dest := [ ] model . Actor { }
err := query . Query ( db , & dest )
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
assert . NilError ( t , err )
2019-03-30 10:17:32 +01:00
}
func TestSelectFunctions ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedQuery := `
SELECT MAX ( film . rental_rate ) AS "max_film_rate"
FROM dvds . film ;
`
query := Film . SELECT ( MAX ( Film . RentalRate ) . AS ( "max_film_rate" ) )
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedQuery )
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
ret := struct {
MaxFilmRate float64
} { }
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & ret )
assert . NilError ( t , err )
assert . Equal ( t , ret . MaxFilmRate , 4.99 )
2019-03-30 10:17:32 +01:00
}
func TestSelectQueryScalar ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
SELECT 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
WHERE film . rental_rate = (
SELECT MAX ( film . rental_rate )
FROM dvds . film
)
ORDER BY film . film_id ASC ;
`
maxFilmRentalRate := NumExp ( Film . SELECT ( MAX ( Film . RentalRate ) ) )
2019-03-30 10:17:32 +01:00
2019-04-03 11:03:07 +02:00
query := Film . SELECT ( Film . AllColumns ) .
2019-04-29 14:39:48 +02:00
WHERE ( Film . RentalRate . Eq ( maxFilmRentalRate ) ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Film . FilmID . ASC ( ) )
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
fmt . Println ( query . Sql ( ) )
assertQuery ( t , query , expectedSql )
2019-03-30 10:17:32 +01:00
maxRentalRateFilms := [ ] model . Film { }
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & maxRentalRateFilms )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
assert . Equal ( t , len ( maxRentalRateFilms ) , 336 )
2019-04-03 19:21:46 +02:00
gRating := model . MpaaRating_G
2019-03-30 10:17:32 +01:00
assert . DeepEqual ( t , maxRentalRateFilms [ 0 ] , model . Film {
FilmID : 2 ,
Title : "Ace Goldfinger" ,
Description : stringPtr ( "A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China" ) ,
ReleaseYear : int32Ptr ( 2006 ) ,
Language : nil ,
RentalRate : 4.99 ,
Length : int16Ptr ( 48 ) ,
ReplacementCost : 12.99 ,
2019-04-03 19:21:46 +02:00
Rating : & gRating ,
2019-03-30 10:17:32 +01:00
RentalDuration : 3 ,
2019-04-03 14:18:58 +02:00
LastUpdate : * timeWithoutTimeZone ( "2013-05-26 14:50:58.951" , 3 ) ,
2019-03-30 10:17:32 +01:00
SpecialFeatures : stringPtr ( "{Trailers,\"Deleted Scenes\"}" ) ,
Fulltext : "'ace':1 'administr':9 'ancient':19 'astound':4 'car':17 'china':20 'databas':8 'epistl':5 'explor':12 'find':15 'goldfing':2 'must':14" ,
} )
}
func TestSelectGroupByHaving ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
SELECT payment . customer_id AS "customer_payment_sum.customer_id" ,
SUM ( payment . amount ) AS "customer_payment_sum.amount_sum"
FROM dvds . payment
GROUP BY payment . customer_id
HAVING SUM ( payment . amount ) > 100
ORDER BY SUM ( payment . amount ) ASC ;
`
2019-03-30 10:17:32 +01:00
customersPaymentQuery := Payment .
2019-04-03 11:03:07 +02:00
SELECT (
2019-05-05 18:03:30 +02:00
Payment . CustomerID . AS ( "customer_payment_sum.customer_id" ) ,
2019-05-12 18:15:23 +02:00
SUM ( Payment . Amount ) . AS ( "customer_payment_sum.amount_sum" ) ,
2019-03-30 10:17:32 +01:00
) .
2019-04-29 14:39:48 +02:00
GROUP_BY ( Payment . CustomerID ) .
2019-05-12 18:15:23 +02:00
ORDER_BY ( SUM ( Payment . Amount ) . ASC ( ) ) .
HAVING ( SUM ( Payment . Amount ) . Gt ( NewNumericLiteral ( 100 ) ) )
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , customersPaymentQuery , expectedSql , 100 )
2019-03-30 10:17:32 +01:00
type CustomerPaymentSum struct {
CustomerID int16
AmountSum float64
}
customerPaymentSum := [ ] CustomerPaymentSum { }
2019-05-12 18:15:23 +02:00
err := customersPaymentQuery . Query ( db , & customerPaymentSum )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
assert . Equal ( t , len ( customerPaymentSum ) , 296 )
assert . DeepEqual ( t , customerPaymentSum [ 0 ] , CustomerPaymentSum {
CustomerID : 135 ,
AmountSum : 100.72 ,
} )
}
func TestSelectGroupBy2 ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
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" ,
customer_payment_sum . amount_sum AS "customer_with_amounts.amount_sum"
FROM dvds . customer
JOIN (
SELECT payment . customer_id AS "payment.customer_id" ,
SUM ( payment . amount ) AS "amount_sum"
FROM dvds . payment
GROUP BY payment . customer_id
) AS customer_payment_sum ON customer . customer_id = customer_payment_sum . "payment.customer_id"
ORDER BY customer_payment_sum . amount_sum ASC ;
`
2019-03-30 10:17:32 +01:00
customersPaymentSubQuery := Payment .
2019-04-03 11:03:07 +02:00
SELECT (
2019-03-30 10:17:32 +01:00
Payment . CustomerID ,
2019-05-12 18:15:23 +02:00
SUM ( Payment . Amount ) . AS ( "amount_sum" ) ,
2019-03-30 10:17:32 +01:00
) .
2019-04-29 14:39:48 +02:00
GROUP_BY ( Payment . CustomerID )
2019-03-30 10:17:32 +01:00
customersPaymentTable := customersPaymentSubQuery . AsTable ( "customer_payment_sum" )
2019-04-03 11:03:07 +02:00
amountSumColumn := customersPaymentTable . RefIntColumnName ( "amount_sum" )
2019-03-30 10:17:32 +01:00
query := Customer .
2019-04-03 11:03:07 +02:00
INNER_JOIN ( customersPaymentTable , Customer . CustomerID . Eq ( customersPaymentTable . RefIntColumn ( Payment . CustomerID ) ) ) .
2019-05-05 18:03:30 +02:00
SELECT ( Customer . AllColumns , amountSumColumn . AS ( "customer_with_amounts.amount_sum" ) ) .
ORDER_BY ( amountSumColumn . ASC ( ) )
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql )
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
type CustomerWithAmounts struct {
Customer * model . Customer
AmountSum float64
}
customersWithAmounts := [ ] CustomerWithAmounts { }
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & customersWithAmounts )
assert . NilError ( t , err )
2019-03-30 10:17:32 +01:00
assert . Equal ( t , len ( customersWithAmounts ) , 599 )
assert . DeepEqual ( t , customersWithAmounts [ 0 ] . Customer , & model . Customer {
CustomerID : 318 ,
StoreID : 1 ,
FirstName : "Brian" ,
LastName : "Wyman" ,
Email : stringPtr ( "brian.wyman@sakilacustomer.org" ) ,
Activebool : true ,
2019-04-03 14:18:58 +02:00
CreateDate : * timeWithoutTimeZone ( "2006-02-14 00:00:00" , 0 ) ,
LastUpdate : timeWithoutTimeZone ( "2013-05-26 14:49:45.738" , 3 ) ,
2019-03-30 10:17:32 +01:00
Active : int32Ptr ( 1 ) ,
} )
assert . Equal ( t , customersWithAmounts [ 0 ] . AmountSum , 27.93 )
2019-04-03 14:18:58 +02:00
}
func TestSelectTimeColumns ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
SELECT payment . payment_id AS "payment.payment_id" ,
payment . customer_id AS "payment.customer_id" ,
payment . staff_id AS "payment.staff_id" ,
payment . rental_id AS "payment.rental_id" ,
payment . amount AS "payment.amount" ,
payment . payment_date AS "payment.payment_date"
FROM dvds . payment
WHERE payment . payment_date <= ' 2007 - 02 - 14 22 : 16 : 01 '
ORDER BY payment . payment_date ASC ;
`
2019-04-03 14:18:58 +02:00
query := Payment . SELECT ( Payment . AllColumns ) .
2019-04-29 14:39:48 +02:00
WHERE ( Payment . PaymentDate . LtEqL ( "2007-02-14 22:16:01" ) ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Payment . PaymentDate . ASC ( ) )
2019-04-03 14:18:58 +02:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql , "2007-02-14 22:16:01" )
2019-04-03 14:18:58 +02:00
payments := [ ] model . Payment { }
2019-03-30 10:17:32 +01:00
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & payments )
2019-04-03 14:18:58 +02:00
assert . NilError ( t , err )
//spew.Dump(payments)
assert . Equal ( t , len ( payments ) , 9 )
assert . DeepEqual ( t , payments [ 0 ] , model . Payment {
PaymentID : 17793 ,
Amount : 2.99 ,
PaymentDate : * timeWithoutTimeZone ( "2007-02-14 21:21:59.996577" , 6 ) ,
} )
2019-03-30 10:17:32 +01:00
}
2019-05-03 11:59:18 +02:00
func TestUnion ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedQuery := `
(
(
SELECT payment . payment_id AS "payment.payment_id" ,
payment . amount AS "payment.amount"
FROM dvds . payment
WHERE payment . amount <= 100
)
UNION ALL
(
SELECT payment . payment_id AS "payment.payment_id" ,
payment . amount AS "payment.amount"
FROM dvds . payment
WHERE payment . amount >= 200
)
)
ORDER BY "payment.payment_id" ASC , "payment.amount" DESC
LIMIT 10
OFFSET 20 ;
`
query := UNION_ALL (
2019-05-03 11:59:18 +02:00
Payment .
2019-05-05 18:03:30 +02:00
SELECT ( Payment . PaymentID . AS ( "payment.payment_id" ) , Payment . Amount ) .
2019-05-03 11:59:18 +02:00
WHERE ( Payment . Amount . LtEqL ( 100 ) ) ,
Payment .
SELECT ( Payment . PaymentID , Payment . Amount ) .
WHERE ( Payment . Amount . GtEqL ( 200 ) ) ,
) .
2019-05-12 18:15:23 +02:00
ORDER_BY ( RefColumn ( "payment.payment_id" ) . ASC ( ) , Payment . Amount . DESC ( ) ) .
LIMIT ( 10 ) .
OFFSET ( 20 )
2019-05-03 11:59:18 +02:00
2019-05-12 18:15:23 +02:00
queryStr , _ , _ := query . Sql ( )
2019-05-03 11:59:18 +02:00
2019-05-12 18:15:23 +02:00
fmt . Println ( "-" + queryStr + "-" )
assertQuery ( t , query , expectedQuery , int ( 100 ) , int ( 200 ) , int64 ( 10 ) , int64 ( 20 ) )
2019-05-03 11:59:18 +02:00
dest := [ ] model . Payment { }
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & dest )
2019-05-03 11:59:18 +02:00
assert . NilError ( t , err )
assert . Equal ( t , len ( dest ) , 10 )
assert . DeepEqual ( t , dest [ 0 ] , model . Payment {
PaymentID : 17523 ,
Amount : 4.99 ,
} )
assert . DeepEqual ( t , dest [ 1 ] , model . Payment {
PaymentID : 17524 ,
Amount : 0.99 ,
} )
assert . DeepEqual ( t , dest [ 9 ] , model . Payment {
PaymentID : 17532 ,
Amount : 8.99 ,
} )
}
2019-05-06 12:42:15 +02:00
func TestSelectWithCase ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedQuery := `
SELECT ( CASE payment . staff_id WHEN 1 THEN ' ONE ' WHEN 2 THEN ' TWO ' WHEN 3 THEN ' THREE ' ELSE ' OTHER ' END ) AS "staff_id_num"
FROM dvds . payment
ORDER BY payment . payment_id ASC
LIMIT 20 ;
`
2019-05-06 12:42:15 +02:00
query := Payment . SELECT (
2019-05-12 18:15:23 +02:00
CASE ( Payment . StaffID ) .
WHEN ( IntLiteral ( 1 ) ) . THEN ( Literal ( "ONE" ) ) .
WHEN ( IntLiteral ( 2 ) ) . THEN ( Literal ( "TWO" ) ) .
WHEN ( IntLiteral ( 3 ) ) . THEN ( Literal ( "THREE" ) ) .
ELSE ( Literal ( "OTHER" ) ) . AS ( "staff_id_num" ) ,
2019-05-06 12:42:15 +02:00
) .
ORDER_BY ( Payment . PaymentID . ASC ( ) ) .
LIMIT ( 20 )
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedQuery , 1 , "ONE" , 2 , "TWO" , 3 , "THREE" , "OTHER" , int64 ( 20 ) )
2019-05-06 12:42:15 +02:00
dest := [ ] struct {
StaffIdNum string
} { }
2019-05-12 18:15:23 +02:00
err := query . Query ( db , & dest )
2019-05-06 12:42:15 +02:00
assert . NilError ( t , err )
assert . Equal ( t , len ( dest ) , 20 )
assert . Equal ( t , dest [ 0 ] . StaffIdNum , "TWO" )
assert . Equal ( t , dest [ 1 ] . StaffIdNum , "ONE" )
}
2019-05-07 13:44:30 +02:00
func TestLockTable ( t * testing . T ) {
2019-05-12 18:15:23 +02:00
expectedSql := `
LOCK TABLE dvds . address IN EXCLUSIVE MODE NOWAIT ;
`
query := Address . LOCK ( ) . IN ( LOCK_EXCLUSIVE ) . NOWAIT ( )
2019-05-07 13:44:30 +02:00
2019-05-12 18:15:23 +02:00
querySql , _ , _ := query . Sql ( )
fmt . Println ( "-" + querySql + "-" )
2019-05-07 13:44:30 +02:00
2019-05-12 18:15:23 +02:00
assertQuery ( t , query , expectedSql )
2019-05-07 13:44:30 +02:00
tx , _ := db . Begin ( )
2019-05-12 18:15:23 +02:00
_ , err := query . Execute ( tx )
2019-05-07 13:44:30 +02:00
assert . NilError ( t , err )
}