如何在on_conflict_do_update期间增加列值?

问题描述 投票:0回答:2

我想插入一行,如果它不会破坏product_id和date列中的唯一值(不作为唯一约束添加),如果它确实如此,我只想增加现有行中的列值。

我想我必须使用:on_conflict_do_update()但我无法找出我应该为index / constraint和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)

提前致谢!

python python-3.x postgresql sqlalchemy upsert
2个回答
1
投票

这对我有用,使用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
投票

根据here的文档,你可以尝试一下:

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)
© www.soinside.com 2019 - 2024. All rights reserved.