假设以下 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/