Python SQL炼金术-将datetime设置为字符串并获取日期?

Python SQL炼金术-将datetime设置为字符串并获取日期?,python,sqlalchemy,Python,Sqlalchemy,我目前正在使用SQL Alchemy设置一个类。此类具有一个start\u 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): __tabl

我目前正在使用SQL Alchemy设置一个类。此类具有一个
start\u 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(开始日期=“2019-05-05”)
打印(foo.start\u日期,类型(foo.start\u日期))
# 2019-05-05 
我希望这里有一个datetime,特别是当从数据库中获取相同记录时,我检索一个date-time对象:

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'>
foo=foo(id=uuid.uuid4(),开始日期=“2019-05-05”)
db_session.add(foo)
db_session.commit()
db_会话刷新(foo)
打印(foo.start\u日期,类型(foo.start\u日期))
# 2019-03-01 00:00:00 

有没有办法强制从
声明中强制转换

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

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

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


请记住,这在一定程度上是我的猜测,实际上我还没有查看SQLAlchemy处理输入值的方式。

我也这么认为。但是,如果您想在将数据插入数据库之前比较日期,那就有点烦人了。:)在这种情况下,请特别注意函数。此外,如果格式一致(破折号在相同的位置,所有分隔字符都相同且没有时区),ISO8601有一种方便的方法,可以同时按词汇和逻辑顺序排列。是的,您必须自己解析它。您可以使用验证器方法和
datetime.strtime
将其抽象出来:非常相关:–“SQLAlchemy没有将其内置,因为它将DBAPI/数据库作为验证和强制值的最佳和最有效的来源。”