【问题标题】:Python Camelot/sqlalchemy: performing math on SelectPython Camelot/sqlalchemy:在 Select 上执行数学运算
【发布时间】:2013-11-26 18:56:31
【问题描述】:

我正在使用 Python Camelot,它在后台使用 sqlalchemy 和 sqlite。我将小时数存储为整数以避免浮点错误。例如,1 小时在数据库中存储为 100,2.5 小时存储为 250,依此类推。当我显示小时数时,我希望它除以 100.0。代码如下:

class Task( Entity ):
    __tablename__ = 'task'
    id = Column( Integer, primary_key=True )
    text = Column( String, nullable=False )
    completed = Column( Boolean, default=False )
    date_created = Column( Date, default=datetime.today )
    date_completed = Column( Date )
    notes = Column( String )

    @property
    def total_hours_estimated (self):
        value = sum([ work.hours_estimated for work in self.work ])
        value = value / 100.0
        return value

    @ColumnProperty
    def total_hours_estimated_colprop (self):
        return sql.select( [sql.func.sum(Work.hours_estimated)],
            Work.task_id == self.id)

class Work( Entity ):
    __tablename__ = 'work'
    id = Column( Integer, primary_key=True )
    date = Column( Date )
    hours_estimated = Column( Integer, default=0 )
    hours_actual = Column( Integer, default=0 )

    task_id = Column( Integer, ForeignKey('task.id') )
    task = relationship(Task, backref='work')

@property 方法计算所需的结果,但在 Camelot 表中查看时,它不允许您按该列排序。文档说你必须使用 ColumnProperty 方法,但我不知道在 ColumnProperty 方法中在哪里划分。有可能吗?

编辑:问题似乎是如果我添加一个浮点除法,sql.select 会返回 Decimal 对象,也许 Camelot 不喜欢这样。示例:

>>> session.query(sql.select( [sql.func.sum(Work.hours_estimated/100.0)])).all()
[(Decimal('5.5000000000'),)]

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    这是因为当涉及到一些数学运算时,SQLAlchemy 自省无法准确知道返回类型,在这种情况下,可能是结果的精度未知,所以你必须帮助它一点。这可以通过字段属性来完成:

    class Task(Entity):
        ...
        class Admin(EntityAdmin):
            list_display = ['id', 'text', 'total_hours_estimated_colprop']
            field_attributes = {
                'total_hours_estimated_colprop': {'delegate':delegates.FloatDelegate',
                                                  'precision': 3} }
    

    这会强制将结果显示为精度为 3 的浮点数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2021-09-28
      • 2020-08-15
      • 1970-01-01
      • 2022-08-15
      • 2023-01-10
      • 2020-11-11
      相关资源
      最近更新 更多