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 - 将日期时间设置为字符串并获取日期?的主要内容,如果未能解决你的问题,请参考以下文章
SQLAlchemy学习-7.Column 设置日期时间类型