如何在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
相关产品推荐
相关产品推荐

