3

是否可以转换go-pg查询

err = db.Model(story).
        Relation("Author").
        Where("story.id = ?", story1.Id).
        Select()

变成普通的 SQL?

这将有助于调试。所以我可以复制这个普通的 SQL 查询并在 psql 客户端中作为字符串运行。可能有某种包装吗?

4

4 回答 4

2

问题:自 v10 以来,没有从 ORM 到 RAW sql 的默认解析。


好吧,我想那已经太晚了。也许有人(比如我)会在 2021 年面临这个问题。有一些步骤可以解决这个问题:

  • [x] 阅读文档。
  • [x] 检查所有结构。
  • [x] 实现所有方法。

解决问题


这个解决方案是从这个问题“分叉”出来的,但我会一步一步地解释它。首先我们需要阅读一些go-pg 钩子的源代码。正如我之前所说:我们需要检查这个文档中的所有结构。但我们很幸运。只有1个结构!

// QueryEvent ...
type QueryEvent struct {
    StartTime  time.Time
    DB         orm.DB
    Model      interface{}
    Query      interface{}
    Params     []interface{}
    fmtedQuery []byte
    Result     Result
    Err        error

    Stash map[interface{}]interface{}
}

我们真的不需要完全实现这个结构。但是,当您使用 db.AddQueryHook() (其中 db 是我们的数据库连接上的参考,而 AddQueryHook() 是方法)时,AddQueryHook() 等待您的这个接口

type QueryHook interface {
    BeforeQuery(context.Context, *QueryEvent) (context.Context, error)
    AfterQuery(context.Context, *QueryEvent) error
}

所以,我们已经阅读了文档,检查了结构。下一步是什么?答案很简单:

  • 实现所有方法。

TBH,我认为这比现在更难。要实现它,您只需要创建 2 个当前(新空)结构的方法来实现上述方法的功能,如下所示:

  1. 创建空结构 type dbLogger struct{}
  2. 从文档添加方法:
func (d dbLogger) BeforeQuery(c context.Context, q *pg.QueryEvent) (context.Context, error) {
    return c, nil
}

func (d dbLogger) AfterQuery(c context.Context, q *pg.QueryEvent) error {
    fq, _ := q.FormattedQuery()
    fmt.Println(string(fq))
    return nil
}

我希望这对遇到这个问题的每个人都有帮助。

于 2021-03-30T11:43:03.670 回答
2

这在项目的 wiki 中列出:

如何查看此库生成的查询?

如何查看此库生成的查询?

您可以像这样设置查询记录器:

type dbLogger struct { }

func (d dbLogger) BeforeQuery(c context.Context, q *pg.QueryEvent) (context.Context, error) {
    return c, nil
}

func (d dbLogger) AfterQuery(c context.Context, q *pg.QueryEvent) (context.Context, error) {
    fmt.Println(q.FormattedQuery())
    return c, nil
}

db := pg.Connect(&pg.Options{...})
db.AddQueryHook(dbLogger{})
于 2019-09-17T11:33:20.460 回答
1
 //db your *pg.DB
// q your  *orm.Query = db.Model(&yourModel).



 qq := pg.QueryEvent{
            DB:        db,
            Model:     q.TableModel(),
            Query:     q,
        }
 fmt.Println(qq.FormattedQuery())

所以在你的情况下

q:= db.Model(story).
        Relation("Author").
        Where("story.id = ?", story1.Id)
fmt.Println("running SQL:")
qq := pg.QueryEvent{
                DB:        db,
                Model:     q.TableModel(),
                Query:     q,
            }
fmt.Println(qq.FormattedQuery()) 
q.Select()
于 2020-12-01T13:29:21.413 回答
1

我刚刚从 go-pg v7 升级到 v10 并且遇到了一个问题,Query.AppendFormat()我用来获取 RAW SQL 的内容已被删除。

在使用这篇文章中的评论获得灵感后,我设法使用下面的代码将其提取出来


import (
    "github.com/go-pg/pg/v10/orm"
)

func QueryToString(q *orm.Query) string {
    value, _ := q.AppendQuery(orm.NewFormatter(), nil)

    return string(value)
}

希望这对未来的观众有所帮助

于 2021-04-20T15:33:53.640 回答