登录
首页 >  Golang >  Go问答

使用 go-pg 包删除多个记录

来源:stackoverflow

时间:2024-02-07 15:06:26 153浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《使用 go-pg 包删除多个记录》,聊聊,我们一起来看看吧!

问题内容

我使用 go-pg 包来处理 postgres。我有以下模型:

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"`
}

有时我需要删除表中的所有记录。所以我这样做:

package storage

import (
    "github.com/go-pg/pg/v9"
)

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"`
}

type PostgresStorage struct {
    db *pg.DB
}

func Connect(ctx context.Context, cfg Config) (*PostgresStorage, error) {
    db, err := database.Connect(ctx, ....)
    if err != nil {
        // ...
    }

    return &PostgresStorage{db: db}, nil
}

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:更新和删除查询需要where子句(尝试wherepk)

我需要无条件删除所有记录。 wherepk() 在这里也没有意义,因为我不按主键选择记录。

我应该在 where 中放入什么?


正确答案


通过将.where("true") 添加到您的delete() 调用中(如注释中提到的@mkopriva),您可以有效地创建一个始终评估为true 的where 子句,匹配表中的所有行。这允许您删除所有记录,而无需指定任何特定条件。

以下是修改代码以实现此目的的方法:

package storage

import (
    "context"
    "github.com/go-pg/pg/v9"
)

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"`
}

type postgresstorage struct {
    db *pg.db
}

func connect(ctx context.context, cfg config) (*postgresstorage, error) {
    db, err := database.connect(ctx, ....)
    if err != nil {
        // ...
    }

    return &postgresstorage{db: db}, nil
}

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
}

您可以使用布尔常量 true 作为唯一的条件表达式,即

delete from ... where true;

我不是 100% 确定 go-pg 方法调用的内容看起来像这样,但可能是这样的:

p.db.ModelContext(ctx, &model).Where("?", true).Delete()

终于介绍完啦!小伙伴们,这篇关于《使用 go-pg 包删除多个记录》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>