SQLAlchemy如何使用timezone = UTC加载日期(没有时区存储的日期)

Max*_* L. 13 python sqlalchemy flask-sqlalchemy

我有一个模型,其日期列定义为:

created_on = db.Column(db.DateTime, default=db.func.now(), nullable=False)
Run Code Online (Sandbox Code Playgroud)

日期与tz_info = None,这是正确的,因为日期存储没有时区信息.

如果我打印日期:

print(my_object.created_on.isoformat())
Run Code Online (Sandbox Code Playgroud)

我得到这种格式

2014-04-26T17:46:27.353936
Run Code Online (Sandbox Code Playgroud)

我想要一个UTC时区指标,例如:

2014-04-26T17:46:27.353936Z
Run Code Online (Sandbox Code Playgroud)

有没有办法在架构配置中定义此行为?

SQLAlchemy有,timezone = Boolean

sqlalchemy.types.DateTime(时区=假)

因为我希望存储没有时区.

Van*_*pps 14

您需要一个自定义数据类型,如下所述: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)
Run Code Online (Sandbox Code Playgroud)

然后就像这样制作列:

created_on = db.Column(AwareDateTime, default=db.func.now(), nullable=False)
Run Code Online (Sandbox Code Playgroud)


rad*_*los 8

我建议使用箭头类型.

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())
Run Code Online (Sandbox Code Playgroud)