-
蛊毒传说
问题:自 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 个方法来实现上述方法的功能,如下所示:创建空结构 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) error { fq, _ := q.FormattedQuery() fmt.Println(string(fq)) return nil}我希望这对遇到此问题的每个人都有帮助。
-
人到中年有点甜
这在项目的 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{})
-
一只萌萌小番薯
我刚刚从 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)}希望这对未来的观众有所帮助
-
鸿蒙传说
//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()