gpt4 book ai didi

python - 如何在运行验证器时使用字典数据更新声明性 SQLAlchemy 模型

转载 作者:行者123 更新时间:2023-11-30 22:35:36 25 4
gpt4 key购买 nike

问题实际上是如何更新 SQLAlchemy 声明性模型以便它运行验证器。就我而言,使用像 User.name = name 这样的 setter 并不是真正的选择。

下面是一个可运行的示例来说明我的意思

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

from sqlalchemy import Column, String, Integer
from sqlalchemy.orm import validates
from sqlalchemy.ext.declarative import declarative_base

some_engine = create_engine('sqlite://')
Session = sessionmaker(bind=some_engine)
session = Session()


Base = declarative_base()


class User(Base):
__tablename__ = 'user'

id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)

@validates('name')
def validate_name(self, key, value):
if value != 'asd':
raise ValueError('not asd')
return value

Base.metadata.create_all(bind=some_engine)

user = User(id=1, name='qwe')
# >>> ValueError: not asd
user = User(id=1, name='asd')

session.add(user)
session.commit()

session.query(User).filter(User.id=1).update({'name': 'qwe'})
session.query(User).filter(User.id==1)[0].name
# >>> 'qwe'

最佳答案

您可以向模型添加一个 mixin,它提供了一个相当简单的更新方法,只需使用 setattr() 来设置实例的属性。

class UpdateMixin:
"""
Add a simple update() method to instances that accepts
a dictionary of updates.
"""
def update(self, values):
for k, v in values.items():
setattr(self, k, v)

用户类别将被定义为

class User(UpdateMixin, Base):
...

要从给定字典更新单个实例,您可以运行

session.query(User).get(1).update({ 'name': 'qwe' })
# or since you have the user instance from before
user.update({ 'name': 'qwe' })

注意 Query.get() 的使用。如果没有给定 id 的用户,它将返回 None 并尝试调用它的更新方法。另一个需要注意的是,如果出现任何异常时不回滚,则无法预测发生了什么(如果有)更新(已添加到 session 中),因为字典没有顺序。因此,如果出现任何错误,请务必回滚。

我还建议实际命名该方法 updateSelf 或类似名称,以防止将其与 Query.update() 混淆的风险。

关于python - 如何在运行验证器时使用字典数据更新声明性 SQLAlchemy 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44515181/

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