gpt4 book ai didi

python - 自动创建相关模型

转载 作者:太空宇宙 更新时间:2023-11-04 05:59:49 25 4
gpt4 key购买 nike

对于 SQLAlchemy,我有一对一的关系:

class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)

class UserProfile(Base):
__tablename__ = 'user_profiles'
user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
user = relationship(User,
backref=backref('profile', uselist=False),
foreign_keys=did)

要求每个 User 总是有一个关联的 UserProfile,即使是这样创建的:

user = User()
session.add(user)
session.commit(user)

有没有办法自动创建和关联相关实体?


目前,我是这样做的:

@event.listens_for(User, 'init')
def on_user_init(target, args, kwargs):
if not target.profile:
target.profile = UserProfile()

然而这有时会导致

IntegrityError: (IntegrityError) duplicate key value violates unique constraint "user_profile_pkey" DETAIL: Key (user_id)=(1) already exists. 'INSERT INTO user_profiles ...

因为 UserProfile 已分配给已存在的用户。

ORM 事件 "before_insert"不适用,因为文档明确指出不允许添加新实例或修改当前实例。

有什么更好的方法可以实现吗?

最佳答案

快速简便的方法是使用“init”事件,但过滤掉具有主键的实例。请注意,在实例初始化时,它是空的,kwargs 参数包含 SqlAlchemy(或您的代码)将在其上设置的字段:

@event.listens_for(User, 'init')
def on_user_init(target, args, kwargs):
if not target.profile and 'id' not in kwargs:
target.profile = UserProfile()

当您使用手动设置的 id 保存实例(例如 User(id=1))时,这仍然不起作用,但会涵盖大多数其他情况。

就目前而言,我没有看到更好的方法。

关于python - 自动创建相关模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25715783/

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