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)
|
||||
}
|
||||
query, args := g.builder.Update(edge.Table).
|
||||
Schema(edge.Schema).
|
||||
SetNull(edge.Columns[0]).
|
||||
Where(pred).
|
||||
Query()
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user