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 個方法來實現上述方法的功能,如下所示:
創建空結構?
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
}
我希望這對遇到此問題的每個人都有幫助。

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{})

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)
}
希望這對未來的觀眾有所幫助

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()
- 4 回答
- 0 關注
- 208 瀏覽
添加回答
舉報