Created
April 5, 2019 05:36
-
-
Save msom/636f695a05a1a7659fae9323933b9012 to your computer and use it in GitHub Desktop.
Polymorphic + Hybrid
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from sqlalchemy import Column, Integer, Text, Float | |
from sqlalchemy import func | |
from sqlalchemy.dialects.postgresql import JSONB | |
from sqlalchemy.ext.declarative import declarative_base | |
from sqlalchemy.ext.hybrid import hybrid_property | |
from sqlalchemy.orm import Session | |
Base = declarative_base() | |
class Measurement(Base): | |
__tablename__ = 'measurements' | |
type = Column(Text, nullable=True) | |
__mapper_args__ = {'polymorphic_on': type} | |
id = Column(Integer, primary_key=True) | |
value = Column(Integer, nullable=False) | |
logger = Column(Integer, nullable=True) | |
channel = Column(Integer, primary_key=True) | |
meta = Column(JSONB, default=dict) | |
class MeasurementA(Measurement): | |
__mapper_args__ = {'polymorphic_identity': 'a'} | |
@hybrid_property | |
def corrected_value(self): | |
return (self.value >> 4) * 0.9987 | |
@corrected_value.expression | |
def corrected_value(cls): | |
return func.cast(cls.value.op('>>')(4), Float) * 0.9987 | |
print( | |
Session().query(MeasurementA.corrected_value).filter( | |
MeasurementA.logger == 1, | |
MeasurementA.channel == 2 | |
) | |
) | |
# SELECT CAST(measurements.value >> :value_1 AS FLOAT) * :param_1 AS corrected_value | |
# FROM measurements | |
# WHERE measurements.logger = :logger_1 AND measurements.channel = :channel_1 AND measurements.type IN (:type_1) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment