Skip to content

Instantly share code, notes, and snippets.

@msom
Created April 5, 2019 05:36
Show Gist options
  • Save msom/636f695a05a1a7659fae9323933b9012 to your computer and use it in GitHub Desktop.
Save msom/636f695a05a1a7659fae9323933b9012 to your computer and use it in GitHub Desktop.
Polymorphic + Hybrid
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