Предполагая следующие модели SQL Алхимии:
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')
Какой самый быстрый и простой способ добавить множество like
отношений между многими User
объектами таким образом, чтобы они не потерпели неудачу при попытке создания дубликатов?
Мое ближайшее решение:
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, если нужен неуниверсальный ответ.