Fix update duplicate ids (#2965)

This commit is contained in:
WithoutPants
2022-09-30 18:44:37 +10:00
committed by GitHub
parent 51f4dd8a59
commit 9e44e13f6d
2 changed files with 66 additions and 13 deletions

View File

@@ -179,21 +179,23 @@ func (t *joinTable) get(ctx context.Context, id int) ([]int, error) {
return ret, nil
}
func (t *joinTable) insertJoin(ctx context.Context, id, foreignID int) (sql.Result, error) {
q := dialect.Insert(t.table.table).Cols(t.idColumn.GetCol(), t.fkColumn.GetCol()).Vals(
goqu.Vals{id, foreignID},
)
ret, err := exec(ctx, q)
if err != nil {
return nil, fmt.Errorf("inserting into %s: %w", t.table.table.GetTable(), err)
}
return ret, nil
}
func (t *joinTable) insertJoins(ctx context.Context, id int, foreignIDs []int) error {
// manually create SQL so that we can prepare once
// ignore duplicates
q := fmt.Sprintf("INSERT INTO %s (%s, %s) VALUES (?, ?) ON CONFLICT (%[2]s, %s) DO NOTHING", t.table.table.GetTable(), t.idColumn.GetCol(), t.fkColumn.GetCol())
tx := dbWrapper{}
stmt, err := tx.Prepare(ctx, q)
if err != nil {
return err
}
defer stmt.Close()
// eliminate duplicates
foreignIDs = intslice.IntAppendUniques(nil, foreignIDs)
for _, fk := range foreignIDs {
if _, err := t.insertJoin(ctx, id, fk); err != nil {
if _, err := tx.ExecStmt(ctx, stmt, id, fk); err != nil {
return err
}
}