Как увеличить значение столбца во время on_conflict_do_update? - PullRequest
0 голосов
/ 22 апреля 2019

Я хотел бы вставить строку, если она не разбивает уникальные значения по столбцам product_id и date (не добавлены как уникальные ограничения), и если это так, я просто хочу увеличить значение столбца в существующей строке.

Я думаю, что должен использовать: on_conflict_do_update() Но я не могу выяснить, что я должен набрать для индекса / ограничения и set_arguments.

Можете ли вы, ребята, указать мне направление? :)

Модель:

class MyModel(db.Model):
    __tablename__ = 'my_model'

    id = Column(Integer, primary_key=True)
    date = Column(Date)
    product_id = Column(Integer, ForeignKey('product.id'))
    counter = Column(Integer)

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Это сработало для меня, используя Postgresql:

from sqlalchemy.dialects.postgresql import insert

class my_table(Base):                                                                                                                        
    __tablename__ = 'foo'
    id = Column(Integer, primary_key=True) 
    counter = Column(Integer)                                                                                                                

insert_stmt = insert(my_table).\
    values(id=42).\
    on_conflict_do_update(index_elements=[my_table.id],
                          set_=dict(counter=my_table.counter+1)).\
    returning(my_table.id)

results = session.execute(insert_stmt)

https://docs.sqlalchemy.org/en/13/dialects/postgresql.html?highlight=conflict#sqlalchemy.dialects.postgresql.dml.Insert.on_conflict_do_nothing

1 голос
/ 22 апреля 2019

Согласно документу здесь здесь , вы можете попробовать:

from sqlalchemy.dialects.mysql import insert

insert_stmt = insert(my_table). \
    values(id='some_id', data='some data to insert')

on_conflict_stmt = insert_stmt.on_duplicate_key_update(
    data=insert_stmt.inserted.data,
    status='U'
)

conn.execute(on_conflict_stmt)
...