登录
首页 >  Golang >  Go问答

Postgresql golang sqlx包查询

来源:stackoverflow

时间:2024-03-16 22:00:25 404浏览 收藏

SQLX 包为 Go 语言提供了对 SQL 数据库的便捷访问。它提供了一个简单易用的 API,可以轻松地执行查询、插入和更新操作。SQLX 还支持高级功能,例如事务和预编译语句。

问题内容

我使用 golang sqlx 包和 postgresql 作为数据库。我有两个简单的表

create table items (
    id varchar unique primary key not null,
    is_active bool not null default false
);

create table images (
    item_id varchar not null,
    link varchar unique not null,
    index int not null,
    foreign key (item_id) references items(id) on delete cascade
);

我需要执行的是在一个查询中获取所有已为其分配图像的项目,并且之后不要使用 go 变量进行操作

我有这样的代码来执行该操作

type Image struct {
    ItemID string `db:"item_id" json:"item_id"`
    Index int `db:"index" json:"index"`
    Link string `db:"link" json:"link"`
}

type Images []Image

func (t Images) Value() (driver.Value, error) {
    b, err := json.Marshal(t); if err != nil {
        return driver.Value(""), err
    }
    return driver.Value(string(b)), nil
}

func (t *Images) Scan (src interface{}) error {
    var source []byte

    if reflect.TypeOf(src) == nil {
        return nil
    }

    switch src.(type) {
        case string:
            source = []byte(src.(string))
        case []byte:
            source = src.([]byte)
        default:
            return errors.New("incompatible type for images")
    }

    return json.Unmarshal(source, t)
}

func GetItems (active bool) (items []Item, err error) {
    conn := postgres.Connection()

    const query = `SELECT *, (
        SELECT json_agg(images) AS images FROM (
            SELECT images.link, images.index FROM images GROUP BY images.link, images.index HAVING bool_or(item_id=items.id) AND count(item_id) > 0
        ) as images
    ) FROM items`

    if err := conn.Select(&items, query, active); err != nil {
        logrus.WithError(err).Errorf("Can not get all items")
    }

    return
}

This works but I can have results with items that has no assigned images for them and this code seems tooo complicated for such simple at first sight task. Wish anyone can help me with that

正确答案


如果我理解正确的话,你想这样做:

select i.id 
from images img
join items i 
 on img.item_id = i.id
where i.isactive =1 
group by i.id

本篇关于《Postgresql golang sqlx包查询》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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