Python SQLAlchemy混合表达式对不同行的访问
我有以下数据模型:Python SQLAlchemy混合表达式对不同行的访问,python,sqlalchemy,Python,Sqlalchemy,我有以下数据模型: class TS(Base): # Parent __tablename__ = 'ts' id = Column(Integer, primary_key=True) inspection_data = relationship('ID', backref='ts', uselist=False) 及 现在我想创建一个混合属性“状态”,告诉我下一次检查是否过期(即今天过期) 我解决了这个问题,只要: @hybrid_property
class TS(Base): # Parent
__tablename__ = 'ts'
id = Column(Integer, primary_key=True)
inspection_data = relationship('ID', backref='ts', uselist=False)
及
现在我想创建一个混合属性“状态”,告诉我下一次检查是否过期(即今天过期)
我解决了这个问题,只要:
@hybrid_property
def status(self):
now = datetime.datetime.utcnow().date()
delta = self.next_inspection - now
if delta.days > 30:
return 3 # OK, next inspection far away
elif delta.days > 0:
return 2 # Next inspection getting close
else: # We are overdue
return 1
这在类和实例级别都有效,这意味着我甚至可以使用status查询。为了工作,我必须补充:
@status.comparator
def status(cls):
return DateTimeComparator(cls.next_inspection)
与
现在我的问题是:
我想返回存储在另一个具有以下模型的表中的三个值中的一个,而不是像上面示例中那样返回状态的值1、2或3:
class IDStatusValues(Base):
__tablename__ = 'ins_status_values'
id = Column(Integer, primary_key=True)
value = Column(Unicode, unique=True, nullable=True, info={})
ID_id = Column(Integer, ForeignKey('ins.id'))
使用以下数据:
id | value
-----------
0 | 'OK'
1 | 'APPROACHING'
2 | 'OVERDUE'
也就是说,我想将status方法更改为如下内容:
@hybrid_property
def status(self):
now = datetime.datetime.utcnow().date()
delta = self.next_inspection - now
if delta.days > 30:
return IDStatusValues.get(0) # OK, next inspection far away
elif delta.days > 0:
return IDStatusValues.get(1) # Next inspection getting close
else: # We are overdue
return IDStatusValues.get(2)
但我不明白如何在这个函数中进行查询。我承认到目前为止我只在声明性方面工作,在真正的SQL/表达性SQL炼金术方面不是很有经验
class TS(Base): # Parent
__tablename__ = 'ts'
id = Column(Integer, primary_key=True)
inspection_data = relationship('ID', backref='ts', uselist=False)`
class ID(Base): # Child
__tablename__ = 'ins'
id = Column(Integer, primary_key=True)
created = Column(Date, default=datetime.datetime.utcnow(), nullable=False)
next_inspection = Column(Date, unique=False, nullable=True)
ts_id = Column(Integer, ForeignKey('ts.id'))
IDStatusValues = relationship('IDStatusValues') **# Add this relationship**
@hybrid_property
def status(self):
now = datetime.datetime.utcnow().date()
delta = self.next_inspection - now
if delta.days > 30:
return self.IDStatusValues.property.table.c.id == 0 # OK, next inspection far away
elif delta.days > 0:
return self.IDStatusValues.property.table.c.id == 1 # Next inspection getting close
else: # We are overdue
return self.IDStatusValues.property.table.c.id == 2`
class IDStatusValues(Base):
__tablename__ = 'ins_status_values'
id = Column(Integer, primary_key=True)
value = Column(Unicode, unique=True, nullable=True, info={})
ID_id = Column(Integer, ForeignKey('ins.id'))`
session.query(ID).filter(ID.status).all()
@hybrid_property
def status(self):
now = datetime.datetime.utcnow().date()
delta = self.next_inspection - now
if delta.days > 30:
return IDStatusValues.get(0) # OK, next inspection far away
elif delta.days > 0:
return IDStatusValues.get(1) # Next inspection getting close
else: # We are overdue
return IDStatusValues.get(2)
class TS(Base): # Parent
__tablename__ = 'ts'
id = Column(Integer, primary_key=True)
inspection_data = relationship('ID', backref='ts', uselist=False)`
class ID(Base): # Child
__tablename__ = 'ins'
id = Column(Integer, primary_key=True)
created = Column(Date, default=datetime.datetime.utcnow(), nullable=False)
next_inspection = Column(Date, unique=False, nullable=True)
ts_id = Column(Integer, ForeignKey('ts.id'))
IDStatusValues = relationship('IDStatusValues') **# Add this relationship**
@hybrid_property
def status(self):
now = datetime.datetime.utcnow().date()
delta = self.next_inspection - now
if delta.days > 30:
return self.IDStatusValues.property.table.c.id == 0 # OK, next inspection far away
elif delta.days > 0:
return self.IDStatusValues.property.table.c.id == 1 # Next inspection getting close
else: # We are overdue
return self.IDStatusValues.property.table.c.id == 2`
class IDStatusValues(Base):
__tablename__ = 'ins_status_values'
id = Column(Integer, primary_key=True)
value = Column(Unicode, unique=True, nullable=True, info={})
ID_id = Column(Integer, ForeignKey('ins.id'))`
session.query(ID).filter(ID.status).all()