SQLAlchemy - 将日期时间设置为字符串并获取日期?

Posted

技术标签:

【中文标题】SQLAlchemy - 将日期时间设置为字符串并获取日期?【英文标题】:SQL Alchemy - Setting datetime as a string and getting a date? 【发布时间】:2019-11-04 18:03:21 【问题描述】:

我目前正在使用 SQL Alchemy 设置课程。这个类有一个start_date属性,定义如:

from sqlalchemy import Column, DateTime
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Foo(Base):
    __tablename__ = "foo"

    id = Column(UUID(as_uuid=True), primary_key=True)
    start_date = Column(DateTime, nullable=True)

然而,我遇到了类型问题:

foo = Foo(start_date="2019-05-05")
print(foo.start_date, type(foo.start_date))

# 2019-05-05 <class 'str'>

我希望这里有一个日期时间,尤其是当从数据库中获取相同的记录时,我会检索一个日期时间对象:

foo = Foo(id=uuid.uuid4(), start_date="2019-05-05")
db_session.add(foo)
db_session.commit()

db_session.refresh(foo)
print(foo.start_date, type(foo.start_date))

# 2019-03-01 00:00:00 <class 'datetime.datetime'>

有什么方法可以强制从Column 声明中强制转换?

【问题讨论】:

是的,你必须自己解析。您可以使用验证器方法和 datetime.strptime 将其抽象出来:docs.sqlalchemy.org/en/13/orm/… 非常相关:***.com/questions/8980735/… – “SQLAlchemy 没有内置此功能,因为它遵循 DBAPI/数据库作为最佳和最有效的验证来源和强制价值。” 【参考方案1】:

我怀疑这里发生的事情是您实际上在第一个 sn-p 中访问的正是您作为 start_date 关键字参数传递的字符串。这表明 SQLAlchemy 实际上并没有强制您输入的类型。

当对象被提交到数据库时,这个字符串 ('2019-05-05') 被传递给 Postgres。由于 SQL 对引用的值进行类型转换,并且格式正确,因此它作为时间戳添加到数据库中。

插入后从数据库中读取整行。这将返回一个datetime 实例,并且该属性将设置为datetime 值。

请记住,这部分是我的推测,我实际上并没有查看 SQLAlchemy 处理输入值的方式。

【讨论】:

我也是这么想的。但是,如果您想比较在数据库中插入数据之前的日期,那就有点烦人了。 :) 在这种情况下,请查看python-dateutil,尤其是dateutil.parser.parse 函数。 另外,如果格式一致(破折号在相同的位置,所有分隔字符相同且没有时区),ISO8601 有一种方便的方式同时处于词汇和逻辑顺序。

以上是关于SQLAlchemy - 将日期时间设置为字符串并获取日期?的主要内容,如果未能解决你的问题,请参考以下文章

python UTC日期和sqlalchemy

SQLAlchemy学习-7.Column 设置日期时间类型

如何在 sqlalchemy 查询中将日期时间更改为字符串? [复制]

如何将日期字符串设置为以下格式

SQLAlchemy:如何按两个字段分组并按日期过滤

JavaScript 之日起对象(转)