mirror of
https://github.com/ent/ent.git
synced 2026-05-28 09:49:08 +03:00
entc/gen: generate sql builders with dialect option
Summary: Pull Request resolved: https://github.com/facebookincubator/ent/pull/130 Reviewed By: alexsn Differential Revision: D18164397 fbshipit-source-id: 2858d69d3ff85c06b51382c01c3d4369ee2c3bdb
This commit is contained in:
committed by
Facebook Github Bot
parent
ea479ea527
commit
c259aee24b
@@ -164,7 +164,8 @@ func (c *UserClient) GetX(ctx context.Context, id uint64) *User {
|
||||
func (c *UserClient) QuerySpouse(u *User) *UserQuery {
|
||||
query := &UserQuery{config: c.config}
|
||||
id := u.ID
|
||||
query.sql = sql.Select().From(sql.Table(user.Table)).
|
||||
builder := sql.Dialect(u.driver.Dialect())
|
||||
query.sql = builder.Select().From(builder.Table(user.Table)).
|
||||
Where(sql.EQ(user.SpouseColumn, id))
|
||||
|
||||
return query
|
||||
@@ -174,15 +175,16 @@ func (c *UserClient) QuerySpouse(u *User) *UserQuery {
|
||||
func (c *UserClient) QueryFollowers(u *User) *UserQuery {
|
||||
query := &UserQuery{config: c.config}
|
||||
id := u.ID
|
||||
t1 := sql.Table(user.Table)
|
||||
t2 := sql.Table(user.Table)
|
||||
t3 := sql.Table(user.FollowersTable)
|
||||
t4 := sql.Select(t3.C(user.FollowersPrimaryKey[0])).
|
||||
builder := sql.Dialect(u.driver.Dialect())
|
||||
t1 := builder.Table(user.Table)
|
||||
t2 := builder.Table(user.Table)
|
||||
t3 := builder.Table(user.FollowersTable)
|
||||
t4 := builder.Select(t3.C(user.FollowersPrimaryKey[0])).
|
||||
From(t3).
|
||||
Join(t2).
|
||||
On(t3.C(user.FollowersPrimaryKey[1]), t2.C(user.FieldID)).
|
||||
Where(sql.EQ(t2.C(user.FieldID), id))
|
||||
query.sql = sql.Select().
|
||||
query.sql = builder.Select().
|
||||
From(t1).
|
||||
Join(t4).
|
||||
On(t1.C(user.FieldID), t4.C(user.FollowersPrimaryKey[0]))
|
||||
@@ -194,15 +196,16 @@ func (c *UserClient) QueryFollowers(u *User) *UserQuery {
|
||||
func (c *UserClient) QueryFollowing(u *User) *UserQuery {
|
||||
query := &UserQuery{config: c.config}
|
||||
id := u.ID
|
||||
t1 := sql.Table(user.Table)
|
||||
t2 := sql.Table(user.Table)
|
||||
t3 := sql.Table(user.FollowingTable)
|
||||
t4 := sql.Select(t3.C(user.FollowingPrimaryKey[1])).
|
||||
builder := sql.Dialect(u.driver.Dialect())
|
||||
t1 := builder.Table(user.Table)
|
||||
t2 := builder.Table(user.Table)
|
||||
t3 := builder.Table(user.FollowingTable)
|
||||
t4 := builder.Select(t3.C(user.FollowingPrimaryKey[1])).
|
||||
From(t3).
|
||||
Join(t2).
|
||||
On(t3.C(user.FollowingPrimaryKey[0]), t2.C(user.FieldID)).
|
||||
Where(sql.EQ(t2.C(user.FieldID), id))
|
||||
query.sql = sql.Select().
|
||||
query.sql = builder.Select().
|
||||
From(t1).
|
||||
Join(t4).
|
||||
On(t1.C(user.FieldID), t4.C(user.FollowingPrimaryKey[1]))
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
package ent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
@@ -168,9 +169,19 @@ func IsConstraintFailure(err error) bool {
|
||||
}
|
||||
|
||||
func isSQLConstraintError(err error) (*ErrConstraintFailed, bool) {
|
||||
// Error number 1062 is ER_DUP_ENTRY in mysql, and "UNIQUE constraint failed" is SQLite prefix.
|
||||
if msg := err.Error(); strings.HasPrefix(msg, "Error 1062") || strings.HasPrefix(msg, "UNIQUE constraint failed") {
|
||||
return &ErrConstraintFailed{msg, err}, true
|
||||
var (
|
||||
msg = err.Error()
|
||||
// error format per dialect.
|
||||
errors = [...]string{
|
||||
"Error 1062", // MySQL 1062 error (ER_DUP_ENTRY).
|
||||
"UNIQUE constraint failed", // SQLite.
|
||||
"duplicate key value violates unique constraint", // PostgreSQL.
|
||||
}
|
||||
)
|
||||
for i := range errors {
|
||||
if strings.Contains(msg, errors[i]) {
|
||||
return &ErrConstraintFailed{msg, err}, true
|
||||
}
|
||||
}
|
||||
return nil, false
|
||||
}
|
||||
@@ -186,6 +197,38 @@ func rollback(tx dialect.Tx, err error) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// insertLastID invokes the insert query on the transaction and returns the LastInsertID.
|
||||
func insertLastID(ctx context.Context, tx dialect.Tx, insert *sql.InsertBuilder) (int64, error) {
|
||||
query, args := insert.Query()
|
||||
// PostgreSQL does not support the LastInsertId() method of sql.Result
|
||||
// on Exec, and should be extracted manually using the `RETURNING` clause.
|
||||
if insert.Dialect() == dialect.Postgres {
|
||||
rows := &sql.Rows{}
|
||||
if err := tx.Query(ctx, query, args, rows); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
defer rows.Close()
|
||||
if !rows.Next() {
|
||||
return 0, fmt.Errorf("no rows found for query: %v", query)
|
||||
}
|
||||
var id int64
|
||||
if err := rows.Scan(&id); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return id, nil
|
||||
}
|
||||
// MySQL, SQLite, etc.
|
||||
var res sql.Result
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
id, err := res.LastInsertId()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return id, nil
|
||||
}
|
||||
|
||||
// keys returns the keys/ids from the edge map.
|
||||
func keys(m map[uint64]struct{}) []uint64 {
|
||||
s := make([]uint64, 0, len(m))
|
||||
|
||||
@@ -263,11 +263,12 @@ func HasSpouse() predicate.User {
|
||||
return predicate.User(
|
||||
func(s *sql.Selector) {
|
||||
t1 := s.Table()
|
||||
builder := sql.Dialect(s.Dialect())
|
||||
s.Where(
|
||||
sql.In(
|
||||
t1.C(FieldID),
|
||||
sql.Select(SpouseColumn).
|
||||
From(sql.Table(SpouseTable)).
|
||||
builder.Select(SpouseColumn).
|
||||
From(builder.Table(SpouseTable)).
|
||||
Where(sql.NotNull(SpouseColumn)),
|
||||
),
|
||||
)
|
||||
@@ -279,8 +280,9 @@ func HasSpouse() predicate.User {
|
||||
func HasSpouseWith(preds ...predicate.User) predicate.User {
|
||||
return predicate.User(
|
||||
func(s *sql.Selector) {
|
||||
builder := sql.Dialect(s.Dialect())
|
||||
t1 := s.Table()
|
||||
t2 := sql.Select(SpouseColumn).From(sql.Table(SpouseTable))
|
||||
t2 := builder.Select(SpouseColumn).From(builder.Table(SpouseTable))
|
||||
for _, p := range preds {
|
||||
p(t2)
|
||||
}
|
||||
@@ -294,10 +296,12 @@ func HasFollowers() predicate.User {
|
||||
return predicate.User(
|
||||
func(s *sql.Selector) {
|
||||
t1 := s.Table()
|
||||
builder := sql.Dialect(s.Dialect())
|
||||
s.Where(
|
||||
sql.In(
|
||||
t1.C(FieldID),
|
||||
sql.Select(FollowersPrimaryKey[1]).From(sql.Table(FollowersTable)),
|
||||
builder.Select(FollowersPrimaryKey[1]).
|
||||
From(builder.Table(FollowersTable)),
|
||||
),
|
||||
)
|
||||
},
|
||||
@@ -308,14 +312,15 @@ func HasFollowers() predicate.User {
|
||||
func HasFollowersWith(preds ...predicate.User) predicate.User {
|
||||
return predicate.User(
|
||||
func(s *sql.Selector) {
|
||||
builder := sql.Dialect(s.Dialect())
|
||||
t1 := s.Table()
|
||||
t2 := sql.Table(Table)
|
||||
t3 := sql.Table(FollowersTable)
|
||||
t4 := sql.Select(t3.C(FollowersPrimaryKey[1])).
|
||||
t2 := builder.Table(Table)
|
||||
t3 := builder.Table(FollowersTable)
|
||||
t4 := builder.Select(t3.C(FollowersPrimaryKey[1])).
|
||||
From(t3).
|
||||
Join(t2).
|
||||
On(t3.C(FollowersPrimaryKey[0]), t2.C(FieldID))
|
||||
t5 := sql.Select().From(t2)
|
||||
t5 := builder.Select().From(t2)
|
||||
for _, p := range preds {
|
||||
p(t5)
|
||||
}
|
||||
@@ -330,10 +335,12 @@ func HasFollowing() predicate.User {
|
||||
return predicate.User(
|
||||
func(s *sql.Selector) {
|
||||
t1 := s.Table()
|
||||
builder := sql.Dialect(s.Dialect())
|
||||
s.Where(
|
||||
sql.In(
|
||||
t1.C(FieldID),
|
||||
sql.Select(FollowingPrimaryKey[0]).From(sql.Table(FollowingTable)),
|
||||
builder.Select(FollowingPrimaryKey[0]).
|
||||
From(builder.Table(FollowingTable)),
|
||||
),
|
||||
)
|
||||
},
|
||||
@@ -344,14 +351,15 @@ func HasFollowing() predicate.User {
|
||||
func HasFollowingWith(preds ...predicate.User) predicate.User {
|
||||
return predicate.User(
|
||||
func(s *sql.Selector) {
|
||||
builder := sql.Dialect(s.Dialect())
|
||||
t1 := s.Table()
|
||||
t2 := sql.Table(Table)
|
||||
t3 := sql.Table(FollowingTable)
|
||||
t4 := sql.Select(t3.C(FollowingPrimaryKey[0])).
|
||||
t2 := builder.Table(Table)
|
||||
t3 := builder.Table(FollowingTable)
|
||||
t4 := builder.Select(t3.C(FollowingPrimaryKey[0])).
|
||||
From(t3).
|
||||
Join(t2).
|
||||
On(t3.C(FollowingPrimaryKey[1]), t2.C(FieldID))
|
||||
t5 := sql.Select().From(t2)
|
||||
t5 := builder.Select().From(t2)
|
||||
for _, p := range preds {
|
||||
p(t5)
|
||||
}
|
||||
|
||||
@@ -114,38 +114,33 @@ func (uc *UserCreate) SaveX(ctx context.Context) *User {
|
||||
|
||||
func (uc *UserCreate) sqlSave(ctx context.Context) (*User, error) {
|
||||
var (
|
||||
res sql.Result
|
||||
u = &User{config: uc.config}
|
||||
res sql.Result
|
||||
builder = sql.Dialect(uc.driver.Dialect())
|
||||
u = &User{config: uc.config}
|
||||
)
|
||||
tx, err := uc.driver.Tx(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
builder := sql.Dialect(uc.driver.Dialect()).
|
||||
Insert(user.Table).
|
||||
Default()
|
||||
insert := builder.Insert(user.Table).Default()
|
||||
if value := uc.name; value != nil {
|
||||
builder.Set(user.FieldName, *value)
|
||||
insert.Set(user.FieldName, *value)
|
||||
u.Name = *value
|
||||
}
|
||||
query, args := builder.Query()
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
return nil, rollback(tx, err)
|
||||
}
|
||||
id, err := res.LastInsertId()
|
||||
id, err := insertLastID(ctx, tx, insert.Returning(user.FieldID))
|
||||
if err != nil {
|
||||
return nil, rollback(tx, err)
|
||||
}
|
||||
u.ID = uint64(id)
|
||||
if len(uc.spouse) > 0 {
|
||||
for eid := range uc.spouse {
|
||||
query, args := sql.Update(user.SpouseTable).
|
||||
query, args := builder.Update(user.SpouseTable).
|
||||
Set(user.SpouseColumn, eid).
|
||||
Where(sql.EQ(user.FieldID, id)).Query()
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
return nil, rollback(tx, err)
|
||||
}
|
||||
query, args = sql.Update(user.SpouseTable).
|
||||
query, args = builder.Update(user.SpouseTable).
|
||||
Set(user.SpouseColumn, id).
|
||||
Where(sql.EQ(user.FieldID, eid).And().IsNull(user.SpouseColumn)).Query()
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
@@ -163,7 +158,7 @@ func (uc *UserCreate) sqlSave(ctx context.Context) (*User, error) {
|
||||
if len(uc.followers) > 0 {
|
||||
for eid := range uc.followers {
|
||||
|
||||
query, args := sql.Insert(user.FollowersTable).
|
||||
query, args := builder.Insert(user.FollowersTable).
|
||||
Columns(user.FollowersPrimaryKey[1], user.FollowersPrimaryKey[0]).
|
||||
Values(id, eid).
|
||||
Query()
|
||||
@@ -175,7 +170,7 @@ func (uc *UserCreate) sqlSave(ctx context.Context) (*User, error) {
|
||||
if len(uc.following) > 0 {
|
||||
for eid := range uc.following {
|
||||
|
||||
query, args := sql.Insert(user.FollowingTable).
|
||||
query, args := builder.Insert(user.FollowingTable).
|
||||
Columns(user.FollowingPrimaryKey[0], user.FollowingPrimaryKey[1]).
|
||||
Values(id, eid).
|
||||
Query()
|
||||
|
||||
@@ -41,12 +41,15 @@ func (ud *UserDelete) ExecX(ctx context.Context) int {
|
||||
}
|
||||
|
||||
func (ud *UserDelete) sqlExec(ctx context.Context) (int, error) {
|
||||
var res sql.Result
|
||||
selector := sql.Select().From(sql.Table(user.Table))
|
||||
var (
|
||||
res sql.Result
|
||||
builder = sql.Dialect(ud.driver.Dialect())
|
||||
)
|
||||
selector := builder.Select().From(sql.Table(user.Table))
|
||||
for _, p := range ud.predicates {
|
||||
p(selector)
|
||||
}
|
||||
query, args := sql.Delete(user.Table).FromSelect(selector).Query()
|
||||
query, args := builder.Delete(user.Table).FromSelect(selector).Query()
|
||||
if err := ud.driver.Exec(ctx, query, args, &res); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
@@ -56,10 +56,12 @@ func (uq *UserQuery) Order(o ...Order) *UserQuery {
|
||||
// QuerySpouse chains the current query on the spouse edge.
|
||||
func (uq *UserQuery) QuerySpouse() *UserQuery {
|
||||
query := &UserQuery{config: uq.config}
|
||||
t1 := sql.Table(user.Table)
|
||||
|
||||
builder := sql.Dialect(uq.driver.Dialect())
|
||||
t1 := builder.Table(user.Table)
|
||||
t2 := uq.sqlQuery()
|
||||
t2.Select(t2.C(user.FieldID))
|
||||
query.sql = sql.Select().
|
||||
query.sql = builder.Select().
|
||||
From(t1).
|
||||
Join(t2).
|
||||
On(t1.C(user.SpouseColumn), t2.C(user.FieldID))
|
||||
@@ -69,15 +71,17 @@ func (uq *UserQuery) QuerySpouse() *UserQuery {
|
||||
// QueryFollowers chains the current query on the followers edge.
|
||||
func (uq *UserQuery) QueryFollowers() *UserQuery {
|
||||
query := &UserQuery{config: uq.config}
|
||||
t1 := sql.Table(user.Table)
|
||||
|
||||
builder := sql.Dialect(uq.driver.Dialect())
|
||||
t1 := builder.Table(user.Table)
|
||||
t2 := uq.sqlQuery()
|
||||
t2.Select(t2.C(user.FieldID))
|
||||
t3 := sql.Table(user.FollowersTable)
|
||||
t4 := sql.Select(t3.C(user.FollowersPrimaryKey[0])).
|
||||
t3 := builder.Table(user.FollowersTable)
|
||||
t4 := builder.Select(t3.C(user.FollowersPrimaryKey[0])).
|
||||
From(t3).
|
||||
Join(t2).
|
||||
On(t3.C(user.FollowersPrimaryKey[1]), t2.C(user.FieldID))
|
||||
query.sql = sql.Select().
|
||||
query.sql = builder.Select().
|
||||
From(t1).
|
||||
Join(t4).
|
||||
On(t1.C(user.FieldID), t4.C(user.FollowersPrimaryKey[0]))
|
||||
@@ -87,15 +91,17 @@ func (uq *UserQuery) QueryFollowers() *UserQuery {
|
||||
// QueryFollowing chains the current query on the following edge.
|
||||
func (uq *UserQuery) QueryFollowing() *UserQuery {
|
||||
query := &UserQuery{config: uq.config}
|
||||
t1 := sql.Table(user.Table)
|
||||
|
||||
builder := sql.Dialect(uq.driver.Dialect())
|
||||
t1 := builder.Table(user.Table)
|
||||
t2 := uq.sqlQuery()
|
||||
t2.Select(t2.C(user.FieldID))
|
||||
t3 := sql.Table(user.FollowingTable)
|
||||
t4 := sql.Select(t3.C(user.FollowingPrimaryKey[1])).
|
||||
t3 := builder.Table(user.FollowingTable)
|
||||
t4 := builder.Select(t3.C(user.FollowingPrimaryKey[1])).
|
||||
From(t3).
|
||||
Join(t2).
|
||||
On(t3.C(user.FollowingPrimaryKey[0]), t2.C(user.FieldID))
|
||||
query.sql = sql.Select().
|
||||
query.sql = builder.Select().
|
||||
From(t1).
|
||||
Join(t4).
|
||||
On(t1.C(user.FieldID), t4.C(user.FollowingPrimaryKey[1]))
|
||||
@@ -363,8 +369,9 @@ func (uq *UserQuery) sqlExist(ctx context.Context) (bool, error) {
|
||||
}
|
||||
|
||||
func (uq *UserQuery) sqlQuery() *sql.Selector {
|
||||
t1 := sql.Table(user.Table)
|
||||
selector := sql.Select(t1.Columns(user.Columns...)...).From(t1)
|
||||
builder := sql.Dialect(uq.driver.Dialect())
|
||||
t1 := builder.Table(user.Table)
|
||||
selector := builder.Select(t1.Columns(user.Columns...)...).From(t1)
|
||||
if uq.sql != nil {
|
||||
selector = uq.sql
|
||||
selector.Select(selector.Columns(user.Columns...)...)
|
||||
@@ -633,5 +640,6 @@ func (us *UserSelect) sqlScan(ctx context.Context, v interface{}) error {
|
||||
|
||||
func (us *UserSelect) sqlQuery() sql.Querier {
|
||||
view := "user_view"
|
||||
return sql.Select(us.fields...).From(us.sql.As(view))
|
||||
return sql.Dialect(us.driver.Dialect()).
|
||||
Select(us.fields...).From(us.sql.As(view))
|
||||
}
|
||||
|
||||
@@ -180,7 +180,10 @@ func (uu *UserUpdate) ExecX(ctx context.Context) {
|
||||
}
|
||||
|
||||
func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) {
|
||||
selector := sql.Select(user.FieldID).From(sql.Table(user.Table))
|
||||
var (
|
||||
builder = sql.Dialect(uu.driver.Dialect())
|
||||
selector = builder.Select(user.FieldID).From(builder.Table(user.Table))
|
||||
)
|
||||
for _, p := range uu.predicates {
|
||||
p(selector)
|
||||
}
|
||||
@@ -208,26 +211,26 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) {
|
||||
}
|
||||
var (
|
||||
res sql.Result
|
||||
builder = sql.Update(user.Table).Where(sql.InInts(user.FieldID, ids...))
|
||||
updater = builder.Update(user.Table).Where(sql.InInts(user.FieldID, ids...))
|
||||
)
|
||||
if value := uu.name; value != nil {
|
||||
builder.Set(user.FieldName, *value)
|
||||
updater.Set(user.FieldName, *value)
|
||||
}
|
||||
if !builder.Empty() {
|
||||
query, args := builder.Query()
|
||||
if !updater.Empty() {
|
||||
query, args := updater.Query()
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
return 0, rollback(tx, err)
|
||||
}
|
||||
}
|
||||
if uu.clearedSpouse {
|
||||
query, args := sql.Update(user.SpouseTable).
|
||||
query, args := builder.Update(user.SpouseTable).
|
||||
SetNull(user.SpouseColumn).
|
||||
Where(sql.InInts(user.FieldID, ids...)).
|
||||
Query()
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
return 0, rollback(tx, err)
|
||||
}
|
||||
query, args = sql.Update(user.SpouseTable).
|
||||
query, args = builder.Update(user.SpouseTable).
|
||||
SetNull(user.SpouseColumn).
|
||||
Where(sql.InInts(user.SpouseColumn, ids...)).
|
||||
Query()
|
||||
@@ -241,13 +244,13 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) {
|
||||
}
|
||||
for eid := range uu.spouse {
|
||||
eid := int(eid)
|
||||
query, args := sql.Update(user.SpouseTable).
|
||||
query, args := builder.Update(user.SpouseTable).
|
||||
Set(user.SpouseColumn, eid).
|
||||
Where(sql.EQ(user.FieldID, ids[0])).Query()
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
return 0, rollback(tx, err)
|
||||
}
|
||||
query, args = sql.Update(user.SpouseTable).
|
||||
query, args = builder.Update(user.SpouseTable).
|
||||
Set(user.SpouseColumn, ids[0]).
|
||||
Where(sql.EQ(user.FieldID, eid).And().IsNull(user.SpouseColumn)).Query()
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
@@ -268,7 +271,7 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) {
|
||||
eid := int(eid)
|
||||
eids = append(eids, eid)
|
||||
}
|
||||
query, args := sql.Delete(user.FollowersTable).
|
||||
query, args := builder.Delete(user.FollowersTable).
|
||||
Where(sql.InInts(user.FollowersPrimaryKey[1], ids...)).
|
||||
Where(sql.InInts(user.FollowersPrimaryKey[0], eids...)).
|
||||
Query()
|
||||
@@ -284,7 +287,7 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) {
|
||||
values = append(values, []int{id, eid})
|
||||
}
|
||||
}
|
||||
builder := sql.Insert(user.FollowersTable).
|
||||
builder := builder.Insert(user.FollowersTable).
|
||||
Columns(user.FollowersPrimaryKey[1], user.FollowersPrimaryKey[0])
|
||||
for _, v := range values {
|
||||
builder.Values(v[0], v[1])
|
||||
@@ -300,7 +303,7 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) {
|
||||
eid := int(eid)
|
||||
eids = append(eids, eid)
|
||||
}
|
||||
query, args := sql.Delete(user.FollowingTable).
|
||||
query, args := builder.Delete(user.FollowingTable).
|
||||
Where(sql.InInts(user.FollowingPrimaryKey[0], ids...)).
|
||||
Where(sql.InInts(user.FollowingPrimaryKey[1], eids...)).
|
||||
Query()
|
||||
@@ -316,7 +319,7 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) {
|
||||
values = append(values, []int{id, eid})
|
||||
}
|
||||
}
|
||||
builder := sql.Insert(user.FollowingTable).
|
||||
builder := builder.Insert(user.FollowingTable).
|
||||
Columns(user.FollowingPrimaryKey[0], user.FollowingPrimaryKey[1])
|
||||
for _, v := range values {
|
||||
builder.Values(v[0], v[1])
|
||||
@@ -490,7 +493,10 @@ func (uuo *UserUpdateOne) ExecX(ctx context.Context) {
|
||||
}
|
||||
|
||||
func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (u *User, err error) {
|
||||
selector := sql.Select(user.Columns...).From(sql.Table(user.Table))
|
||||
var (
|
||||
builder = sql.Dialect(uuo.driver.Dialect())
|
||||
selector = builder.Select(user.Columns...).From(builder.Table(user.Table))
|
||||
)
|
||||
user.ID(uuo.id)(selector)
|
||||
rows := &sql.Rows{}
|
||||
query, args := selector.Query()
|
||||
@@ -521,27 +527,27 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (u *User, err error) {
|
||||
}
|
||||
var (
|
||||
res sql.Result
|
||||
builder = sql.Update(user.Table).Where(sql.InInts(user.FieldID, ids...))
|
||||
updater = builder.Update(user.Table).Where(sql.InInts(user.FieldID, ids...))
|
||||
)
|
||||
if value := uuo.name; value != nil {
|
||||
builder.Set(user.FieldName, *value)
|
||||
updater.Set(user.FieldName, *value)
|
||||
u.Name = *value
|
||||
}
|
||||
if !builder.Empty() {
|
||||
query, args := builder.Query()
|
||||
if !updater.Empty() {
|
||||
query, args := updater.Query()
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
return nil, rollback(tx, err)
|
||||
}
|
||||
}
|
||||
if uuo.clearedSpouse {
|
||||
query, args := sql.Update(user.SpouseTable).
|
||||
query, args := builder.Update(user.SpouseTable).
|
||||
SetNull(user.SpouseColumn).
|
||||
Where(sql.InInts(user.FieldID, ids...)).
|
||||
Query()
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
return nil, rollback(tx, err)
|
||||
}
|
||||
query, args = sql.Update(user.SpouseTable).
|
||||
query, args = builder.Update(user.SpouseTable).
|
||||
SetNull(user.SpouseColumn).
|
||||
Where(sql.InInts(user.SpouseColumn, ids...)).
|
||||
Query()
|
||||
@@ -555,13 +561,13 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (u *User, err error) {
|
||||
}
|
||||
for eid := range uuo.spouse {
|
||||
eid := int(eid)
|
||||
query, args := sql.Update(user.SpouseTable).
|
||||
query, args := builder.Update(user.SpouseTable).
|
||||
Set(user.SpouseColumn, eid).
|
||||
Where(sql.EQ(user.FieldID, ids[0])).Query()
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
return nil, rollback(tx, err)
|
||||
}
|
||||
query, args = sql.Update(user.SpouseTable).
|
||||
query, args = builder.Update(user.SpouseTable).
|
||||
Set(user.SpouseColumn, ids[0]).
|
||||
Where(sql.EQ(user.FieldID, eid).And().IsNull(user.SpouseColumn)).Query()
|
||||
if err := tx.Exec(ctx, query, args, &res); err != nil {
|
||||
@@ -582,7 +588,7 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (u *User, err error) {
|
||||
eid := int(eid)
|
||||
eids = append(eids, eid)
|
||||
}
|
||||
query, args := sql.Delete(user.FollowersTable).
|
||||
query, args := builder.Delete(user.FollowersTable).
|
||||
Where(sql.InInts(user.FollowersPrimaryKey[1], ids...)).
|
||||
Where(sql.InInts(user.FollowersPrimaryKey[0], eids...)).
|
||||
Query()
|
||||
@@ -598,7 +604,7 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (u *User, err error) {
|
||||
values = append(values, []int{id, eid})
|
||||
}
|
||||
}
|
||||
builder := sql.Insert(user.FollowersTable).
|
||||
builder := builder.Insert(user.FollowersTable).
|
||||
Columns(user.FollowersPrimaryKey[1], user.FollowersPrimaryKey[0])
|
||||
for _, v := range values {
|
||||
builder.Values(v[0], v[1])
|
||||
@@ -614,7 +620,7 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (u *User, err error) {
|
||||
eid := int(eid)
|
||||
eids = append(eids, eid)
|
||||
}
|
||||
query, args := sql.Delete(user.FollowingTable).
|
||||
query, args := builder.Delete(user.FollowingTable).
|
||||
Where(sql.InInts(user.FollowingPrimaryKey[0], ids...)).
|
||||
Where(sql.InInts(user.FollowingPrimaryKey[1], eids...)).
|
||||
Query()
|
||||
@@ -630,7 +636,7 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (u *User, err error) {
|
||||
values = append(values, []int{id, eid})
|
||||
}
|
||||
}
|
||||
builder := sql.Insert(user.FollowingTable).
|
||||
builder := builder.Insert(user.FollowingTable).
|
||||
Columns(user.FollowingPrimaryKey[0], user.FollowingPrimaryKey[1])
|
||||
for _, v := range values {
|
||||
builder.Values(v[0], v[1])
|
||||
|
||||
Reference in New Issue
Block a user