sqlchemy stmt实现: 批量更新;若A字段值大于新值,则不更新A字段值(其他字段正常更新)

from sqlalchemy import  update
    async def test_case(self):
        test = [
            {
                "temp_id": 4111,
                "bind_next_sync_time": 100000,
                "last_success_time": 20301,
            },
            {
                "temp_id": 4112,
                "bind_next_sync_time": 200000,
                "last_success_time": 20301,
            },
        ]
        stmt = update(SearchContentDocTask).where(
            and_(
                SearchContentDocTask.id == bindparam("temp_id"),
            )
        )
        stmt = stmt.values(
            next_sync_time=case(
                [
                    (
                        SearchContentDocTask.next_sync_time
                        < bindparam("bind_next_sync_time"),
                        bindparam("bind_next_sync_time"),
                    )
                ],
                else_=SearchContentDocTask.next_sync_time,
            )
        )
        # 此行代码最终执行:await async_session.execute(stmt, test)
        count = await self.update(stmt, test)

stmt的解释:根据id批量更新SearchContentDocTask表对应行数据,更新时比较next_sync_time的值,若新值大于原表值,则next_sync_time为新值,其他字段正常更新

其他使用

from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import case
from sqlalchemy.sql.expression import select

# 创建数据库连接
engine = create_engine('sqlite:///example.db', echo=True)
Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

Base.metadata.create_all(engine)

# 插入测试数据
user1 = User(name='Alice', age=25)
user2 = User(name='Bob', age=30)
session.add_all([user1, user2])
session.commit()

# 使用CASE WHEN语句进行查询
stmt = select(User.id, User.name, case([(User.age < 30, 'young')], else_='old')).where(User.name == 'Bob')
result = session.execute(stmt)
for row in result:
    print(row)

session.close()

首先定义了一个User类,它是一个ORM模型,映射到数据库的users表。我们使用session.execute函数执行了一条带有CASE WHEN语句的查询。在这个查询中,根据User表中的age字段是否小于30,我们将结果定义为’young’或者’old’。最后,我们通过迭代结果集来输出查询结果。

更新

 

from sqlalchemy import update

# 使用CASE WHEN语句更新记录
stmt = update(User).\
    where(User.name == 'Alice').\
    values(name=case([(User.age < 30, 'Alice (young)')], else_='Alice (old)'))

session.execute(stmt)
session.commit()

使用update函数构建了一个带有CASE WHEN语句的更新语句。根据User表中的age字段是否小于30,我们将name字段更新为不同的值 

插入

from sqlalchemy import insert

# 使用CASE WHEN语句插入记录
stmt = insert(User).\
    values(id=3, name=case([(User.age < 30, 'Charlie (young)')], else_='Charlie (old)'))

session.execute(stmt)
session.commit()

使用insert函数构建了一个带有CASE WHEN语句的插入语句。根据User表中的age字段是否小于30,我们将name字段设置为不同的值。 

你可能感兴趣的:(python)