mirror of
https://github.com/ent/ent.git
synced 2026-03-05 19:35:23 +03:00
dialect/sql/sqlgraph: set schema when clearing foreign key edges (#4429)
* set schema in clearfkedges func * add test case for clearing bidirectional o2o foreign key
This commit is contained in:
@@ -1801,6 +1801,7 @@ func (g *graph) clearFKEdges(ctx context.Context, ids []driver.Value, edges []*E
|
|||||||
pred = matchIDs(edge.Target.IDSpec.Column, edge.Target.Nodes, edge.Columns[0], ids)
|
pred = matchIDs(edge.Target.IDSpec.Column, edge.Target.Nodes, edge.Columns[0], ids)
|
||||||
}
|
}
|
||||||
query, args := g.builder.Update(edge.Table).
|
query, args := g.builder.Update(edge.Table).
|
||||||
|
Schema(edge.Schema).
|
||||||
SetNull(edge.Columns[0]).
|
SetNull(edge.Columns[0]).
|
||||||
Where(pred).
|
Where(pred).
|
||||||
Query()
|
Query()
|
||||||
|
|||||||
@@ -1674,6 +1674,7 @@ type user struct {
|
|||||||
id int
|
id int
|
||||||
age int
|
age int
|
||||||
name string
|
name string
|
||||||
|
bfID int
|
||||||
edges struct {
|
edges struct {
|
||||||
fk1 int
|
fk1 int
|
||||||
fk2 int
|
fk2 int
|
||||||
@@ -1684,7 +1685,7 @@ func (*user) values(columns []string) ([]any, error) {
|
|||||||
values := make([]any, len(columns))
|
values := make([]any, len(columns))
|
||||||
for i := range columns {
|
for i := range columns {
|
||||||
switch c := columns[i]; c {
|
switch c := columns[i]; c {
|
||||||
case "id", "age", "fk1", "fk2":
|
case "id", "age", "best_friend_id", "fk1", "fk2":
|
||||||
values[i] = &sql.NullInt64{}
|
values[i] = &sql.NullInt64{}
|
||||||
case "name":
|
case "name":
|
||||||
values[i] = &sql.NullString{}
|
values[i] = &sql.NullString{}
|
||||||
@@ -1707,6 +1708,8 @@ func (u *user) assign(columns []string, values []any) error {
|
|||||||
u.age = int(values[i].(*sql.NullInt64).Int64)
|
u.age = int(values[i].(*sql.NullInt64).Int64)
|
||||||
case "name":
|
case "name":
|
||||||
u.name = values[i].(*sql.NullString).String
|
u.name = values[i].(*sql.NullString).String
|
||||||
|
case "best_friend_id":
|
||||||
|
u.bfID = int(values[i].(*sql.NullInt64).Int64)
|
||||||
case "fk1":
|
case "fk1":
|
||||||
u.edges.fk1 = int(values[i].(*sql.NullInt64).Int64)
|
u.edges.fk1 = int(values[i].(*sql.NullInt64).Int64)
|
||||||
case "fk2":
|
case "fk2":
|
||||||
@@ -2024,6 +2027,39 @@ func TestUpdateNode(t *testing.T) {
|
|||||||
},
|
},
|
||||||
wantUser: &user{name: "Ariel", age: 30, id: 1},
|
wantUser: &user{name: "Ariel", age: 30, id: 1},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "schema/edges/clear_bidi_o2o",
|
||||||
|
spec: &UpdateSpec{
|
||||||
|
Node: &NodeSpec{
|
||||||
|
Table: "users",
|
||||||
|
Schema: "mydb",
|
||||||
|
Columns: []string{"id", "name", "age", "best_friend_id"},
|
||||||
|
ID: &FieldSpec{Column: "id", Type: field.TypeInt, Value: 1},
|
||||||
|
},
|
||||||
|
Edges: EdgeMut{
|
||||||
|
Clear: []*EdgeSpec{
|
||||||
|
// Clear O2O bidi edge
|
||||||
|
{Rel: O2O, Schema: "mydb", Table: "users", Bidi: true, Columns: []string{"best_friend_id"}, Target: &EdgeTarget{IDSpec: &FieldSpec{Column: "id"}}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
prepare: func(mock sqlmock.Sqlmock) {
|
||||||
|
mock.ExpectBegin()
|
||||||
|
// Clear best friend.
|
||||||
|
mock.ExpectExec(escape("UPDATE `mydb`.`users` SET `best_friend_id` = NULL WHERE `id` = ?")).
|
||||||
|
WithArgs(1).
|
||||||
|
WillReturnResult(sqlmock.NewResult(1, 1))
|
||||||
|
mock.ExpectExec(escape("UPDATE `mydb`.`users` SET `best_friend_id` = NULL WHERE `best_friend_id` = ?")).
|
||||||
|
WithArgs(1).
|
||||||
|
WillReturnResult(sqlmock.NewResult(1, 1))
|
||||||
|
mock.ExpectQuery(escape("SELECT `id`, `name`, `age`, `best_friend_id` FROM `mydb`.`users` WHERE `id` = ?")).
|
||||||
|
WithArgs(1).
|
||||||
|
WillReturnRows(sqlmock.NewRows([]string{"id", "age", "name", "best_friend_id"}).
|
||||||
|
AddRow(1, 31, nil, nil))
|
||||||
|
mock.ExpectCommit()
|
||||||
|
},
|
||||||
|
wantUser: &user{age: 31, id: 1},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user