SQLAlchemy日期和时间列作为InstrumentedAttribute返回

时间:2016-05-20 17:12:14

标签: python postgresql sqlalchemy

我不确定我做错了什么。我已经读过其他问题,InstrumentedAttribute与关系有关,但是如果你查看下面的代码,start_date不是关系列。当我尝试在self.start_date属性中使用self.start_timestart_datetime()时,它们都是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)

1 个答案:

答案 0 :(得分:0)

在更全面地阅读the docs regarding 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