代码之家  ›  专栏  ›  技术社区  ›  Libra

在Sqlalchemy get()上转换时区

  •  1
  • Libra  · 技术社区  · 6 年前

    我正在用Sqlalchemy(带Postgres)在烧瓶应用程序中摆弄时区。Postgres将datetime保存为带有时区的时间戳,默认情况下,所有datetime都存储在UTC中。使用python的钟摆库很容易转换到不同的时区。

    class Order(Model): 
        id = Column(Integer, primary_key=True)
        code = Column(String(10))
        order_date = Column(DateTime(timezone=True))
    

    我想把 order_date 一个 Order -由一个 order_id -查询时将其发送到用户的时区。我能做到(我想) user.timezone 是一个有效的时区):

    order = db.session.query(id, 
                             code,
                             func.timezone(user.timezone, Order.order_date).label('order_date'))\
              .filter(Order.id == order_id)\
              .first()
    

    但有时更容易 get 这个 顺序 :

    order = Order.query.get(order_id)
    

    通过后一种方式,我获得存储的UTC 订单日期 .可以将 订单日期 使用 收到 作用

    我的解决办法是 收到 对象,检查模型的字段(假设在实际情况下,一个对象可能有多个datetime字段),如果一个字段是 datetime ,将其转换为用户的时区,如下所示:

    import datetime
    import pendulum
    
    def convert_tz(obj, tz):
        for each in obj.__dict__:
            d = getattr(obj, each)
            if isinstance(d, datetime.datetime):
                setattr(obj, each, tz.convert(d))
    
    order = Order.query.get(order_id)
    tz = pendulum.timezone(user.timezone)
    convert_tz(order, tz)
    

    这似乎很有效,但也似乎太复杂了。有更好的办法吗? 谢谢

    0 回复  |  直到 6 年前