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字段设置为不同的值。