gpt4 book ai didi

python - 如何在 SQLAlchemy 中保存计算列?

转载 作者:行者123 更新时间:2023-12-03 08:35:52 26 4
gpt4 key购买 nike

我想知道如何以干净的方式将计算值保存在数据库中:

示例(取自 SQLAlchemy 手册):

Base = declarative_base()

class Interval(Base):
__tablename__ = 'interval'

id = Column(Integer, primary_key=True)
start = Column(Integer)
end = Column(Integer)

@hybrid_property
def length(self):
return self.end - self.start

因此计算出长度。但为了更轻松地进行查询查找(在另一个数据库工具中),我希望将此长度也保存到表中。

所以我的第一个粗略测试就是简单地添加:length = Column(Float)。显然这不起作用(但我想我还是会尝试一下:p),因为长度方法会覆盖长度列。

现在我能想到的唯一方法是在 init 中计算它并推迟到 super(),如下所示:

Base = declarative_base()

class Interval(Base):
__tablename__ = 'interval'

id = Column(Integer, primary_key=True)
start = Column(Integer)
end = Column(Integer)
length = Column(Integer)

def __init__(self, *args, **kwargs):
kwargs['length'] = kwargs['end'] - kwargs['start']
super().__init__(*args, **kwargs)

但是,我觉得应该有一种更干净的方法。有吗?

谢谢!

最佳答案

有几种方法可以处理这个问题。

其中一个是 before_updatebefore_insert 触发器。这些是 SQLAlchemy 的东西,其中会自动检测模型的更改,并在将行写入服务器之前调度事件。然后,您可以使用它来抢占保存,可能会查看哪些列已更改,然后相应地更新 length

另一种方法是使用生成计算列。这些已在Postgres 12中介绍过。 ,它们也存在于 MySQL、Oracle 和 MS SQL Server 中——尽管我对此知之甚少。它们本质上做同样的事情,但您只需将该逻辑添加到表定义中,然后您就可以忘记它。 SQLAlchemy 从 1.3.11 开始支持它们.

关于python - 如何在 SQLAlchemy 中保存计算列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63870313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com