You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SqlAlchemy中实现两列拼接的ilike查询?

在SQLAlchemy中实现PostgreSQL的全名模糊查询

你可以通过两种常用方式在SQLAlchemy中重现目标PostgreSQL查询,分别适配ORM和Core两种使用场景:

ORM 方式(基于模型类)

假设你已经定义了映射users表的User模型类:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    first_name = Column(String)
    last_name = Column(String)

方法1:使用func.concat拼接字段

通过SQLAlchemy的func.concat函数实现字段拼接,再调用ilike执行模糊匹配:

from sqlalchemy import func

# 用户传入的全名
target_full_name = "Mark Zuckerberg"
# 构造查询
query = session.query(User.first_name, User.last_name).filter(
    func.concat(User.first_name, ' ', User.last_name).ilike(f'%{target_full_name}%')
)
# 执行查询并获取结果
results = query.all()

方法2:直接使用字符串加法运算符

SQLAlchemy支持用+运算符对应PostgreSQL的||拼接语法,写法更直观:

target_full_name = "Mark Zuckerberg"
query = session.query(User.first_name, User.last_name).filter(
    (User.first_name + ' ' + User.last_name).ilike(f'%{target_full_name}%')
)
results = query.all()

SQLAlchemy Core 方式(直接操作表对象)

如果不使用ORM模型,直接通过Core操作表:

from sqlalchemy import create_engine, MetaData, Table, Column, String, func

# 初始化连接和表对象
engine = create_engine('postgresql://your_user:your_password@your_host/your_db')
metadata = MetaData()
users_table = Table(
    'users', metadata,
    Column('first_name', String),
    Column('last_name', String)
)

target_full_name = "Mark Zuckerberg"
# 执行查询
with engine.connect() as conn:
    result_set = conn.execute(
        users_table.select()
        .with_only_columns([users_table.c.first_name, users_table.c.last_name])
        .filter(
            (users_table.c.first_name + ' ' + users_table.c.last_name).ilike(f'%{target_full_name}%')
        )
    )
    # 遍历结果
    for row in result_set:
        print(row.first_name, row.last_name)

安全注意事项

如果用户输入的全名包含%或_这类模糊匹配的特殊字符,直接拼接会导致匹配异常或SQL注入风险,建议使用参数化方式处理:

target_full_name = "Mark_Zuckerberg"
# 自动处理特殊字符的参数化写法
pattern = f"%{target_full_name}%"
query = session.query(User.first_name, User.last_name).filter(
    func.concat(User.first_name, ' ', User.last_name).ilike(pattern)
)

内容的提问来源于stack exchange,提问作者James Rasmussen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:35:12