diff --git a/dialect/sql/sqlgraph/graph.go b/dialect/sql/sqlgraph/graph.go index c41c6b9ca..ac6a77aeb 100644 --- a/dialect/sql/sqlgraph/graph.go +++ b/dialect/sql/sqlgraph/graph.go @@ -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) } query, args := g.builder.Update(edge.Table). + Schema(edge.Schema). SetNull(edge.Columns[0]). Where(pred). Query() diff --git a/dialect/sql/sqlgraph/graph_test.go b/dialect/sql/sqlgraph/graph_test.go index 13bcf87ae..ac1b0859d 100644 --- a/dialect/sql/sqlgraph/graph_test.go +++ b/dialect/sql/sqlgraph/graph_test.go @@ -1674,6 +1674,7 @@ type user struct { id int age int name string + bfID int edges struct { fk1 int fk2 int @@ -1684,7 +1685,7 @@ func (*user) values(columns []string) ([]any, error) { values := make([]any, len(columns)) for i := range columns { switch c := columns[i]; c { - case "id", "age", "fk1", "fk2": + case "id", "age", "best_friend_id", "fk1", "fk2": values[i] = &sql.NullInt64{} case "name": 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) case "name": u.name = values[i].(*sql.NullString).String + case "best_friend_id": + u.bfID = int(values[i].(*sql.NullInt64).Int64) case "fk1": u.edges.fk1 = int(values[i].(*sql.NullInt64).Int64) case "fk2": @@ -2024,6 +2027,39 @@ func TestUpdateNode(t *testing.T) { }, 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 { t.Run(tt.name, func(t *testing.T) {