Python 使用型号'进行批量更新;SQLAlchemy中的s方法
我正在用SQLAlchemy开发一个应用程序,遇到了一些问题。我希望在查询返回的所有模型上运行一个方法,并在单个SQL查询中实现所有这些,同时保持ORM提供的可读性 该方法非常简单,不依赖任何外部数据,也不进行任何查询。如果批量更新中的所有模型使用相同的精确值也可以,因此该值本身只需计算一次 这是我的模型:Python 使用型号'进行批量更新;SQLAlchemy中的s方法,python,sqlalchemy,Python,Sqlalchemy,我正在用SQLAlchemy开发一个应用程序,遇到了一些问题。我希望在查询返回的所有模型上运行一个方法,并在单个SQL查询中实现所有这些,同时保持ORM提供的可读性 该方法非常简单,不依赖任何外部数据,也不进行任何查询。如果批量更新中的所有模型使用相同的精确值也可以,因此该值本身只需计算一次 这是我的模型: class Item(db.Model): last_fetch = db.Column(db.DateTime) def refresh(self): s
class Item(db.Model):
last_fetch = db.Column(db.DateTime)
def refresh(self):
self.last_fetch = datetime.utcnow()
我想对查询返回的所有模型调用refresh()
函数-为了示例起见,让我们假设它是Item.query.all()
我可以遍历它们并在每个模型上运行该方法,但这将为每个模型运行单独的查询:
items = Item.query.all()
for item in items:
item.refresh()
或者我可以执行以下操作,但是现在我已经将我的refresh()
逻辑从模型移动到了只调用该方法的代码中:
items = Item.query.all()
items.update({Item.last_fetch: datetime.utcnow()})
有更好的解决办法吗?一种在模型上定义“智能”方法的方法,该方法允许ORM批量运行它,同时仍然保持它是一种模型方法
注意。因为SQLAlchemy不使用
\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
而使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
您可以在您的模型上覆盖\uuuuu new\uuuuu
,或者尝试查看中介绍的@orm.recostructor
装饰器是否有效
使用重建器:
class Item(db.Model):
last_fetch = db.Column(db.DateTime)
@orm.reconstructor
def set_last_fetch_on_load(self):
self.last_fetch = datetime.datetime.now()
覆盖\uuuu新建\uuuuu
:
class Item(db.Model):
last_fetch = db.Column(db.DateTime)
def __new__(cls, *args, **kwargs):
obj = object.__new__(cls, *args, **kwargs)
obj.last_fetch = datetime.datetime.now()
return obj
注意:尚未对其进行测试。这不会导致每次实例化模型时都重置日期吗?那不是我想要的。我希望能够手动触发它(我只在特定条件下调用它)。它将在每次查询项目时更新日期。所以每次你从数据库中取出它们。如果你只需要在特定的条件下做这件事,我认为你所写的会起作用,你可以忽略我的答案。