2017-04-21 103 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的有效字段以确认(它应该是无效的)。