from sqlalchemy import Column, Integer, String, Numeric, Date, UniqueConstraint, func from commons.models.mixin.calculator import CalculatorMixin from commons.models.model import Model from core.extensions import db class AsphaltImported(db.Model, Model, CalculatorMixin): __tablename__ = 'ASPHALT_IMPORTED' id = Column('ID', Integer, primary_key=True) name = Column('NAME', String(128), default='', comment='名称') price = Column('PRICE', Numeric(16, 4), default=0, comment='价格') date = Column('DATE', Date, comment='日期') __table_args__ = ( UniqueConstraint(name, date, name='Idx_key'), {'comment': '进口沥青'}, ) @classmethod def get_items(cls, year, month, name_in): query = cls.query query = cls.query_by_month(query, year, month) query = query.filter(cls.name.in_(name_in)) query = query.with_entities(cls.name, func.avg(cls.price)) query = query.group_by(cls.name) result = query.all() return result @classmethod def get_by_key(cls, name, date): query = cls.query query = query.filter( cls.name == name, cls.date == date, ) return query.one_or_none() def upsert(self): result = self.get_by_key(self.name, self.date) if not result: session = db.session session.add(self) session.commit() else: session = db.session self.id = result.id session.add(result) session.commit()