亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 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 客戶端中運行??赡苡心撤N包可以做到這一點?
查看完整描述

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 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號