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

标签 python python-3.x postgresql sqlalchemy

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

相关文章:

python - 如何打开与 Selenium 的特定链接?

python - 从列表列表中的项目形成数组

sql - case 语句中 "then"处或附近的语法错误

java - 用于测试的免费 postgres 托管

python - 迭代时更改列表

python - Django 使用字符串来过滤模型以避免重复

python 3 : how to import a module

sql - 查找具有相似日期值的行

javascript - 使用 python 和 urllib 从网页打印代码

Python获取完整程序 "self"