可以转换围棋查询吗?
err = db.Model(story).
Relation("Author").
Where("story.id = ?", story1.Id).
Select()
变成普通的SQL?
这将有助于调试。因此,我可以复制这个普通的SQL查询,并以字符串的形式在psql客户机中运行。可能有什么包裹吗?
发布于 2021-04-20 15:33:53
我刚刚从go-pg v7升级到了v10 &出现了一个问题,就是删除了用于获取原始SQL的Query.AppendFormat()
。
在使用本文中的注释作为灵感之后,我使用下面的代码对其进行了解压。
import (
"github.com/go-pg/pg/v10/orm"
)
func QueryToString(q *orm.Query) string {
value, _ := q.AppendQuery(orm.NewFormatter(), nil)
return string(value)
}
希望这对未来的观众有帮助
发布于 2019-09-17 11:33:20
在项目的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{})
发布于 2021-03-30 11:43:03
问题:自v10以来,不存在从ORM对原始sql的默认解析。
我想那太晚了。也许有人(像我)会在2021年面临这个问题。有几个步骤可以解决这个问题:
解决问题
这个解决方案是从这个问题“分叉”出来的,但是我会一步一步解释它。首先,我们需要阅读一些源代码的围棋-pg钩子。正如我前面所说:我们需要检查这个文档中的所有结构。但我们很幸运。只有一个结构!
// 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是DB连接上的ref,而AddQueryHook()是方法)时,AddQueryHook()等待来自您的接口
type QueryHook interface {
BeforeQuery(context.Context, *QueryEvent) (context.Context, error)
AfterQuery(context.Context, *QueryEvent) error
}
所以,我们已经读过文档,检查了结构。接下来是什么?答案很简单:
我觉得这比现在难多了。要实现它,只需创建两个当前(新的空)结构的方法,实现上述方法的功能,如下所示:
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
}
我希望这能帮助每一个遇到这个问题的人。
https://stackoverflow.com/questions/57973171
复制相似问题