如何在 on_conflict_do_update 期间增加列值?
How to increment column value during on_conflict_do_update?
如果它不破坏跨 product_id 和日期列的唯一值(未添加为唯一约束),我想插入一行,如果是,我只想增加列值现有行。
我想我必须使用:
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)
提前致谢!
根据此处的文档 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)
这对我有用,使用 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)
如果它不破坏跨 product_id 和日期列的唯一值(未添加为唯一约束),我想插入一行,如果是,我只想增加列值现有行。
我想我必须使用:
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)
提前致谢!
根据此处的文档 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)
这对我有用,使用 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)