第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用 SQL 和 gRPC 時(shí)如何使用 Scan 和 Value?

使用 SQL 和 gRPC 時(shí)如何使用 Scan 和 Value?

Go
FFIVE 2023-08-07 15:01:50
有人可以解釋如何在下面的示例中正確使用Scan()and嗎?Value()我正在嘗試使用以下示例:https://github.com/jinzhu/gorm/issues/2017#issuecomment-537627961https://github.com/travisjeffery/proto-go-sql/blob/master/_example/person_sql.go我的原型:message Timestamp {  google.protobuf.Timestamp timestamp = 1;}message User {  uint32 ID = 1;  Timestamp createdAt = 2;}代碼(需要修復(fù)time.Now()):package v1import (        "database/sql/driver"        "fmt"        "time"        "github.com/golang/protobuf/ptypes")func (u *User) Create() {  u.CreatedAt = time.Now() // FIXME: ERROR. How do I make use of Scan() and Value() here?  // saving to SQL database}func (ts *Timestamp) Scan(value interface{}) error {    switch t := value.(type) {    case time.Time:            var err error            ts.Timestamp, err = ptypes.TimestampProto(t)            if err != nil {                    return err            }    default:            return fmt.Errorf("Not a protobuf Timestamp")    }    return nil}func (ts Timestamp) Value() (driver.Value, error) {        return ptypes.Timestamp(ts.Timestamp)}
查看完整描述

1 回答

?
智慧大石

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊

掃描器和評(píng)估器接口實(shí)際上并不是您自己使用的東西,至少在數(shù)據(jù)庫(kù)中存儲(chǔ)自定義類型時(shí)不是這樣。Scan()我將首先介紹和函數(shù)的使用Value(),然后解決您的問(wèn)題。

當(dāng)您獲得sql.Row結(jié)果并想要將結(jié)果集中的值分配(掃描)到自定義類型的變量中時(shí)。文檔顯示該sql.Row.Scan()函數(shù)接受 0 個(gè)或多個(gè)類型的參數(shù)interface{},基本上是任何東西。

在可以掃描值的支持類型列表中,最后一行是重要的一行:

任何實(shí)現(xiàn)掃描儀的類型(請(qǐng)參閱掃描儀文檔)

通過(guò) function?func (ts *Timestamp) Scan(value interface{}) error {,該Timestamp類型現(xiàn)在實(shí)現(xiàn)了該Scanner接口,從而允許sql.Row向該類型分配值。該Scanner接口的文檔位于Scan()我上面鏈接的 文檔的正下方。

當(dāng)然,這可以幫助您從數(shù)據(jù)庫(kù)讀取值,但在存儲(chǔ)這些類型時(shí)卻無(wú)濟(jì)于事。為此,您需要Valuer接口。如果您還沒(méi)有猜到,該func (ts Timestamp) Value() (driver.Value, error)函數(shù)確實(shí)使您的Timestamp類型實(shí)現(xiàn)了此接口。

Valuer接口的要點(diǎn)是允許一種將任何類型轉(zhuǎn)換為 a 的方法driver.Value,驅(qū)動(dòng)程序可以使用該類型并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中


解決問(wèn)題

首先,我必須假設(shè)您的協(xié)議輸出已寫入包中v1。如果不是,它對(duì)你來(lái)說(shuō)不會(huì)有很好的效果。

有問(wèn)題的行確實(shí)是您標(biāo)記的行:

u.CreatedAt?=?time.Now()

首先,User.CreatedAt類型為Timestamp,它本身就是一條包含單個(gè)時(shí)間戳的消息。要將CreatedAt時(shí)間設(shè)置為time.Now(),您需要CreatedAt正確初始化該字段:

u.CreatedAt?=?&Timestamp{
????Timestamp:?ptypes.TimestampNow(),?//?this?returns?a?PROTOBUF?TYPE!
????}

已經(jīng)Scan在你的函數(shù)中這樣做了Value?,所以我真的不明白你為什么不在這里這樣做......


建議

如果協(xié)議輸出確實(shí)寫入了v1包,我真的真的會(huì)刪除該User.Create()函數(shù)。事實(shí)上,我會(huì)直接殺死它。您的協(xié)議緩沖區(qū)用于通信。通過(guò) RPC 公開(kāi)您的程序。這是一個(gè) API。這些message類型本質(zhì)上是請(qǐng)求和響應(yīng)對(duì)象(如果您愿意的話,可以美化 DTO)。您正在Create向其中添加此功能,這會(huì)將它們變成 AR 類型。它使您的 protobuf 包無(wú)法使用。gRPC 的美妙之處在于您可以生成 golang、C++、Python...代碼,其他人可以使用這些代碼來(lái)調(diào)用您的程序。如果你讓你的 gRPC 包依賴于數(shù)據(jù)庫(kù),就像你所做的那樣,我個(gè)人永遠(yuǎn)不會(huì)使用它。


查看完整回答
反對(duì) 回復(fù) 2023-08-07
  • 1 回答
  • 0 關(guān)注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)