SQLAlchemy日期和时间列作为InstrumentedAttribute返回[英] SQLAlchemy Date and Time columns returned as InstrumentedAttribute

本文是小编为大家收集整理的关于SQLAlchemy日期和时间列作为InstrumentedAttribute返回的处理方法,想解了SQLAlchemy日期和时间列作为InstrumentedAttribute返回的问题怎么解决?SQLAlchemy日期和时间列作为InstrumentedAttribute返回问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我不确定我做错了什么.我在其他问题中读到 InstrumentedAttribute 与关系有关,但是如果您查看下面的代码, start_date 不是关系列.当我尝试在 start_datetime() 属性中使用 self.start_date 或 self.start_time 时,它们都是 sqlalchemy.orm.attributes.InstrumentedAttribute 对象,我找不到任何方法来获取日期或时间.我正在使用 Python 3.4.3、SQLAlchemy 1.0.12、psycopg2 2.6.1 和 postgresql 9.3.12

Base = declarative_base()

class OnetimeReservation(Base):
    __tablename__ = 'OnetimeReservation'

    id = Column(Integer, primary_key=True, autoincrement=True)
    resource_id = Column(Integer, ForeignKey('Resource.id', ondelete='CASCADE', onupdate='CASCADE'))
    job_id = Column(Integer, nullable=True)
    start_date = Column(Date)
    start_time = Column(Time, nullable=True)
    duration = Column(Integer, nullable=True)
    date_created = Column(DateTime, server_default=text('CURRENT_TIMESTAMP'))
    created_by = Column(String(128), server_default=text('CURRENT_USER'))
    date_last_modified = Column(DateTime, server_default=text('CURRENT_TIMESTAMP'), server_onupdate=text('CURRENT_TIMESTAMP'))
    last_modified_by = Column(String(128), server_default=text('CURRENT_USER'), server_onupdate=text('CURRENT_USER'))

    resource = relationship('Resource')

    @hybrid_property
    def start_datetime(self):
        return datetime.combine(self.start_date, self.start_time)

推荐答案

经过更彻底的阅读关于 hybrid_property 的文档,我想我知道发生了什么.它被称为"混合"属性的原因是它可以与类的实例或类本身一起调用.当用作过滤器参数时,它与类本身一起调用,并且似乎试图将代码转换为 SQL.有一种方法可以为 @start_time.expression 提供一个单独的实现,该实现将被类调用.感谢大家的帮助,我能够制定出一个似乎可行的简单实现.结果如下:

@hybrid_property
def start_datetime(self):
    if not self.start_time:  # start_time can be null
        return None
    return datetime.combine(self.start_date, self.start_time)

@start_datetime.expression
def start_datetime(cls):
    return cls.start_date + cls.start_time

本文地址:https://www.itbaoku.cn/post/1763985.html