SQLAlchemy 如何加载不带时区的UTC日期

18 投票
2 回答
13583 浏览
提问于 2025-04-18 04:24

我有一个模型,其中有一个日期列,定义如下:

created_on = db.Column(db.DateTime, default=db.func.now(), nullable=False)

这些日期出来的时候,tz_info是None,这样是对的,因为这些日期是没有时区信息存储的。

如果我打印这个日期:

print(my_object.created_on.isoformat())

我得到的格式是

2014-04-26T17:46:27.353936

我希望能有一个UTC时区的标识,比如:

2014-04-26T17:46:27.353936Z

有没有办法在模式配置中定义这种行为呢?

SQLAlchemy有一个选项,timezone=Boolean

sqlalchemy.types.DateTime(timezone=False)

因为我希望存储的时候不带时区。

2 个回答

10

我建议使用 Arrow 类型

from datetime import datetime
from sqlalchemy_utils import ArrowType
import arrow


class Article(Base):
    __tablename__ = 'article'
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.Unicode(255))
    created_at = sa.Column(ArrowType)



article = Article(created_at=arrow.utcnow())
19

你想要创建一个自定义的数据类型,具体内容可以在这里找到:http://docs.sqlalchemy.org/en/rel_0_9/core/types.html#custom-types

具体来说,就是像下面这样:

import pytz  # from PyPI

class AwareDateTime(db.TypeDecorator):
    '''Results returned as aware datetimes, not naive ones.
    '''

    impl = db.DateTime

    def process_result_value(self, value, dialect):
        return value.replace(tzinfo=pytz.utc)

然后只需要像这样定义列:

created_on = db.Column(AwareDateTime, default=db.func.now(), nullable=False)

撰写回答