如何使用go-pg包删除PostgreSQL表中所有记录?
Go-pg全表删除解决方案
你使用go-pg定义了如下DataItem模型:
type DataItem struct{ tableName struct{} `pg:"some_table"` SomeID string `pg:"some_id,pk"` SomeData string `pg:"some_data"` UpdatedAt time.Time `pg:"updated_at"` }
编写全表删除方法时:
func (p *PostgresStorage) deleteAll(ctx context.Context) error { model := DataItem{} _, err := p.db.ModelContext(ctx, &model).Delete() if err != nil { return fmt.Errorf("DELETE: %w", err) } return nil }
遇到错误:pg: Update and Delete queries require Where clause (try WherePK)
go-pg出于安全考虑,强制要求Delete、Update操作必须携带WHERE子句,避免误删/误改全表数据。如果确实需要删除全表所有记录,可以添加一个恒成立的条件来满足框架要求,比如Where("true")或者Where("1=1")。
修改后的deleteAll方法示例:
func (p *PostgresStorage) deleteAll(ctx context.Context) error { model := DataItem{} _, err := p.db.ModelContext(ctx, &model).Where("true").Delete() if err != nil { return fmt.Errorf("DELETE: %w", err) } return nil }
如果你更倾向于直接执行原生SQL,也可以用以下方式:
func (p *PostgresStorage) deleteAll(ctx context.Context) error { _, err := p.db.ExecContext(ctx, "DELETE FROM some_table") if err != nil { return fmt.Errorf("DELETE: %w", err) } return nil }
内容的提问来源于stack exchange,提问作者Yura
相关产品推荐
相关产品推荐

