gpt4 book ai didi

sqlalchemy - 关联代理 SQLAlchemy

转载 作者:行者123 更新时间:2023-12-04 10:42:16 28 4
gpt4 key购买 nike

This source详细说明如何使用关联代理创建具有 ORM 对象值的 View 和对象。

但是,当我附加一个与数据库中现有对象匹配的值(并且所述值是唯一的或主键)时,它会创建一个冲突的对象,因此我无法提交。

所以在我的情况下,这仅作为 View 有用,我需要使用 ORM 查询来检索要附加的对象。

这是我唯一的选择还是我可以使用合并(如果它是主键而不是唯一约束,我可能只能这样做),或者设置构造函数,以便它将使用数据库中的现有对象(如果存在)而不是创建一个新对象?

例如来自文档:

user.keywords.append('cheese inspector')

# Is translated by the association proxy into the operation:

user.kw.append(Keyword('cheese inspector'))

但我想被翻译成更像:(当然查询可能会失败)。
keyword = session.query(Keyword).filter(Keyword.keyword == 'cheese inspector').one()
user.kw.append(keyword)

或理想情况下
user.kw.append(Keyword('cheese inspector'))
session.merge() # retrieves identical object from the database, or keeps new one
session.commit() # success!

我想这甚至可能不是一个好主意,但它可能适用于某些用例:)

最佳答案

您链接到的文档页面上显示的示例是 composition关系类型(在 OOP 术语中),因此表示 owns关系类型而不是 uses在动词方面。因此每个owner将拥有自己的相同(就值而言)关键字的副本。

事实上,您可以完全使用您在问题中链接到的文档中的建议来创建自定义 creator方法并破解它以重用给定键的现有对象,而不是仅仅创建一个新对象。在这种情况下 User 的示例代码类(class)和 creator函数如下所示:

def _keyword_find_or_create(kw):
keyword = Keyword.query.filter_by(keyword=kw).first()
if not(keyword):
keyword = Keyword(keyword=kw)
# if aufoflush=False used in the session, then uncomment below
#session.add(keyword)
#session.flush()
return keyword

class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String(64))
kw = relationship("Keyword", secondary=lambda: userkeywords_table)
keywords = association_proxy('kw', 'keyword',
creator=_keyword_find_or_create, # @note: this is the
)

关于sqlalchemy - 关联代理 SQLAlchemy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9674166/

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