@AlexBoss

Как массово добавить данные с использованием SQLAlchemy ORM с проверкой есть ли они уже?

К примеру, у меня есть 2 таблицы
node = Table(
    "node",
    metadata_obj,
    Column("node_id", Integer, primary_key=True),
    Column("primary_element", Integer, ForeignKey("element.element_id")),
)

element = Table(
    "element",
    metadata_obj,
    Column("element_id", Integer, primary_key=True),
    Column("text", Text),
    Column("parent_node_id", Integer),
    ForeignKeyConstraint(
        ["parent_node_id"], ["node.node_id"], name="fk_element_parent_node_id"
    ),
)

Я хочу вставить в таблицу 'element' данные, если нет записи таким text и node_id из связанной таблицы.
Думал сделать через

objects = [User(name="u1"), User(name="u2"), User(name="u3")]
session.add_all(objects)
session.commit()

Но не совсем понимаю, как сюда добавить ограничение not exists
  • Вопрос задан
  • 477 просмотров
Решения вопроса 1
Dr_Elvis
@Dr_Elvis
В гугле забанен
Например для Postgres on_conflict_do_nothing
Или INSERT…ON CONFLICT
У меня Postgres, я сделал on_conflict_do_update так:
class HeroCard(db.Model):
    id = db.Column(db.Integer, primary_key=True, nullable=False)
    heroid = db.Column(db.Integer, ForeignKey('hero.id'))
    cardid = db.Column(db.Integer, ForeignKey('card.id'))
    count = db.Column(db.Integer)
    db.UniqueConstraint(heroid, cardid, name='hero_card_un')

upd = insert(HeroCard).values(heroid=id, cardid=cid, count=count)
do_upd_upd = upd.on_conflict_do_update(constraint='hero_card_un', set_={'count': HeroCard.count+count})
db.session.execute(do_upd_upd)
db.session.commit()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы