2017-04-21 62 views
2

我有一個時間字段一個struct,可能是無返回值來嵌入建議here結構與SQLX不從數據庫

而是更新Order對象(我不想泄露DB代碼到模型層)的,我想我可以在PgOrder使嵌入秩序和改變PickupTime類型:

type PgOrder struct { 
    Order 
    PickupTime pq.NullTime 
} 

問題是當我簡單地更新數據庫中的Order,然後轉過頭來獲取該訂單時,返回的PickupTime爲空。

// update 
func (pg Postgres) UpdateOrderPickupTime(order *Order, pickupTime time.Time) error { 
    _, err := pg.Exec(`UPDATE orders SET pickup_time = $1 WHERE id = $2`, pickupTime, order.ID) 
    return err 
} 

// retrieve 
func (pg Postgres) GetOrder(orderID DatabaseID) (*Order, error) { 
    pgOrder := PgOrder{} 
    err := pg.Get(&pgOrder, `SELECT * FROM orders WHERE id = $1`, orderID) 
    if err == sql.ErrNoRows { 
     return nil, nil 
    } 
    ... // at this point pgOrder.PickupTime is 0001-01-01 00:00:00 +0000 UTC 

} 

如果我把一個斷點愨更新和檢索,我可以檢查數據庫,看到的值被保存爲2017-04-20 12:05:37-04。所以問題必須在檢索部分。如果我明白從docs開始,sqlx應該能夠處理嵌入式結構。

+0

什麼是數據庫本身的價值:所以就像你與json標籤一樣,你可以用db標籤這樣做呢? '0001-01-01 00:00:00 +0000 UTC'看起來像從數據庫中讀取零時間 - 如果讀取了NULL,我認爲它是'nil'。 – Flimzy

+0

數據庫中的值看起來像'2017-04-20 12:05:37-04' – tir38

+0

只是猜測,但您是否嘗試更改'PgOrder'字段的順序?也就是說,在底部嵌入'Order'並在其上面具有'PickupTime pq.NullTime'。像這樣:https://play.golang.org/p/_QdVNbWcqS – mkopriva

回答

1

如果您的字段是指向某物的指針,例如*time.Time*string您應該不需要使用NullXxx類型。這些類型在你有非零字段時使用,例如time.Timestring,而它的相應列可以是NULL

無論如何,爲了避免已經被@Dmitri Goldring提及的潛在影子,您可以告訴sqlx跳過您不希望它掃描列的字段。

type Order struct { 
    ... 
    PickupTime *time.Time `json:"-" db:"-"` 
} 

type PgOrder struct { 
    Order 
    PickupTime pq.NullTime 
} 
2

它看起來像你陰影PickupTime。如果我正在閱讀sqlx文檔,這意味着它將存儲第一個找到的值(在Order中),然後當您讀取PgOrder中的值時,這是一個未初始化的時間。您可以檢查PgOrder.PickupTime的有效字段以確認(它應該是無效的)。