为了账号安全,请及时绑定邮箱和手机立即绑定

将 go-pg 查询转换为纯 sql

将 go-pg 查询转换为纯 sql

Go
Cats萌萌 2023-07-26 13:32:03
是否可以转换go-pg查询err = db.Model(story).         Relation("Author").         Where("story.id = ?", story1.Id).         Select()变成普通的 SQL?这对于调试会有帮助。所以我可以复制这个简单的 SQL 查询并作为字符串在 psql 客户端中运行。可能有某种包可以做到这一点?
查看完整描述

4 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

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


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

  • [x] 阅读文档。

  • [x] 检查所有结构。

  • [x] 实现所有方法。

解决问题


这个解决方案是从这个问题“分叉”出来的,但我将逐步解释它。首先我们需要阅读go-pg hook 的一些源代码。正如我之前所说:我们需要检查此文档中的所有结构。但我们很幸运。只有 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

}

所以,我们已经阅读了文档,检查了结构。接下来会发生什么?答案很简单:

  • 实施所有方法。

说实话,我认为这比实际情况更难。要实现它,您只需要创建当前(新的空)结构的 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

}

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


查看完整回答
反对 回复 2023-07-26
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

这在项目的 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{})


查看完整回答
反对 回复 2023-07-26
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

我刚刚从 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)

}


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


查看完整回答
反对 回复 2023-07-26
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

 //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()


查看完整回答
反对 回复 2023-07-26
  • 4 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信