【问题标题】:Need to convert sql-query into go-pg orm需要将sql-query转换成go-pg orm
【发布时间】:2021-04-28 20:01:10
【问题描述】:

有一个看起来像这样的查询

   q = 'select distinct t.uuid, t.tags
    from tags as t
    inner join tag_item ti on t.uuid = ti.item_id
    inner join tag_words tw on ti.tag_id = tw.id
    where tw.tag in (?) and ti.item_id in (?)'

如果我使用err := s.db.QueryContext(ctx, &resp, q, p1, p2),它可以正常工作

但我并不总是有p1 和p2,所以我希望能够很好地将它们分开。我尝试过这样的事情:

    var resp []*models.TagRecord

    q := s.db.ModelContext(ctx, &resp).ColumnExpr("distinct tags.uuid, tags.tags")
    q = q.Join("inner join tag_item as ti").JoinOn("ti.item_id=tags.uuid")
    if len(filters.UUIDs) != 0 {
        q = q.JoinOn("ti.item_id IN (?)", pg.In(filters.UUIDs))
    }

    q = q.Join("inner join tag_words as tw").JoinOn("tw.id=ti.tag_id")
    if len(filters.Tags) != 0 {
        q = q.JoinOn("tw.tag IN (?)", pg.In(filters.Tags))
    }

    err := q.Select()

但是我收到了这个错误:

ERROR #42P01 对表“tags”的 FROM 子句条目的引用无效)

我做错了什么,我怎样才能做到这一点?

【问题讨论】:

  • 在您的第一个查询(您提到的原始 SQL 有效)中,表名是 tag_item,但在代码块中您将其命名为 tag_items。这可能是它失败并出现错误 relation "tag_items" does not exist" 的原因
  • 修复了这个问题,谢谢,现在收到此错误 #42P01 对表 \"tags\"" 的 FROM 子句条目的无效引用)

标签: go go-pg


【解决方案1】:

有一个好主意,用普通的 sql 记录查询的样子,tx 到这个线程的答案 convert go-pg query into plain sql 做到了,并想出了如何使上面的代码工作,结果很简单:

var resp []*models.TagRecord

q := s.db.ModelContext(ctx, &resp).ColumnExpr("distinct tag_record.uuid, tag_record.tags")
q = q.Join("inner join tag_item as ti").JoinOn("tag_record.uuid=ti.item_id")
if len(filters.UUIDs) != 0 {
    q = q.JoinOn("ti.item_id IN (?)", pg.In(filters.UUIDs))
}

q = q.Join("inner join tag_words as tw").JoinOn("ti.tag_id=tw.id")
if len(filters.Tags) != 0 {
    q = q.JoinOn("tw.tag IN (?)", pg.In(filters.Tags))
}

err := q.Select()

table tags 别名为 tag_record,因此更改了对该别名的调用,一切顺利)

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 2021-12-17
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2021-08-01
    • 2019-09-14
    相关资源
    最近更新 更多