gpt4 book ai didi

python - 通过 SQL Alchemy 中的表插入多对多关联

转载 作者:行者123 更新时间:2023-11-29 13:13:21 26 4
gpt4 key购买 nike

假设以下 SQL Alchemy 模型:

likes = db.Table('likes',
db.Column('from_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
db.Column('to_id', db.Integer, db.ForeignKey('user.id'), primary_key=True)
)

class User(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
liked_by = db.relationship('User', secondary=likes, foreign_keys=likes.c.to_id, lazy='subquery')
likes = db.relationship('User', secondary=likes, foreign_keys=likes.c.from_id, lazy='subquery')

在许多 User 对象之间添加许多 like 关系的最快和最简单的方法是什么,并且在尝试复制时不会失败?

我最接近的解决方案是:

x = [
{'from_id': 1, 'to_id': 2},
{'from_id': 2, 'to_id': 3},
{'from_id': 1, 'to_id': 3},
...
]
stmt = likes.insert().values(x)
session.execute(stmt)
session.commit()

但是,如果 1 -> 2 已经存在,整个交易将失败。有没有什么方法可以在 likes 表中添加新行并且不会在现有行上失败?

解决方案应该是高性能的(即支持批量插入)。如果需要非通用答案,则数据库为 PostgreSQL 10.x。

最佳答案

您可以使用最近添加到 Postgresql 的“upsert”功能。如果您只想忽略重复项,请使用 ON CONFLICT DO NOTHING :

from sqlalchemy.dialects.postgresql import insert

stmt = insert(likes).values(x).on_conflict_do_nothing()
...

关于python - 通过 SQL Alchemy 中的表插入多对多关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52056772/

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