首页 > 解决方案 > SQL Alchemy - 将日期时间设置为字符串并获取日期?

问题描述

我目前正在使用 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声明中强制转换?

标签: pythonsqlalchemy

解决方案


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

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

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

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


推荐阅读