SQLAlchemy 的基本使用(模糊查询 与 数据去重)

本文介绍了如何使用 SQLAlchemy 在 Python 中进行 SQL 模糊查询和数据去重操作。通过 `.like()` 方法实现模糊匹配,利用 `distinct()` 或 `group_by()` 进行数据去重。示例代码清晰,适合初学者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接:https://www.cnblogs.com/kaerxifa/p/13476317.html

1.模糊查询

原生sql写法:

SELECT * FROM 表名 WHERE 字段名 LIKE '%匹配内容%' ;

利用sqlalchemy实现模糊查询:

center_filter = db.query(BudgetOrganizational).filter(
BudgetOrganizational.center_name.like('%'+ center_name +'%')
 ).all()

解释:利用 .like('%匹配内容%') 实现模糊查询
备注:BudgetOrganizational是一个数据模型;第一个center_name是数据模型中的一个字段;第二个center_name 是一个变量,由前端传递过来的; 

遇到问题:匹配内容是 变量 怎么办?

解决方案:直接用 + 拼接 就好啦 ~

2.数据去重

(1). distinct

# 去重查询distinct
from sqlalchemy import distinct
session.query(distinct(BudgetOrganizational.center_name)).all()

(2). group_by

session.query(BudgetOrganizational.center_name).group_by(BudgetOrganizational.center_name).all()

注意:一般查询出来的结果都是列表,要想转换查询结果类型,不需要for循环然后把每个元素打印出来看type类型(一般是<class 'sqlalchemy.engine.row.Row'>),看了也不知道如何转换

最好的办法是直接将查询结果打印出来,然后想办法重组结果即可。

3.SQLAlchemy的简单使用

文章写的很nice,附上链接可参看~

博文链接: https://www.cnblogs.com/testlearn/p/14122184.html

 

<think>嗯,用户问的是SQLAlchemy如何进行模糊查询。首先,我得回忆一下SQL中的模糊查询是怎么做的。通常是用LIKE操作符,结合百分号%或者下划线_这样的通配符。比如要找名字包含“张”的记录,SQL语句大概是SELECT * FROM table WHERE name LIKE '%张%'。那在SQLAlchemy里应该怎么实现呢? 我记得SQLAlchemy有两种主要的查询方式,一种是Core方式,用表达式语言,另一种是ORM方式,用模型类。可能需要分别介绍这两种方法。不过用户可能更常用ORM,所以应该点讲ORM的部分,但最好也提一下Core,以备不同需求。 首先,ORM的话,通常会使用filter方法,然后在里面写条件。比如,假设有个User模型,有name字段,模糊查询应该是User.name.like('%keyword%')。这里要注意的是,like方法需要传入带有通配符的字符串,所以用户需要自己处理百分号的添加。或者,有没有其他方法?比如ilike做不区分大小写的匹配? 另外,有时候用户可能想根据变量动态生成查询条件,比如用户输入的关键字是变量,这时候需要把变量插入到like的参数中。这时候要确保正确的字符串格式化,避免SQL注入,所以应该用参数化的方式,而不是直接拼接字符串。SQLAlchemy的like方法会自动处理参数,所以用户只需要传入带有通配符的字符串即可。 然后,除了like,还有match操作符,不过那个更多用于全文搜索,可能和数据库有关,比如MySQL的MATCH AGAINST。不过这可能属于更高级的用法,用户可能只是需要基本的模糊查询,所以先不深入这部分。 还有,SQLAlchemy是否支持正则表达式?比如PostgreSQL的~操作符,或者其他数据库的正则语法。这可能属于数据库特定的功能,需要用到op方法或者其他扩展,但可能不是用户问题的核心。所以暂时不提,除非用户问到。 接下来,可能需要举例说明。比如,查找名字包含“张”的用户,ORM的写法是session.query(User).filter(User.name.like('%张%')).all()。这时候,用户需要记得在关键字前后加%,否则就是精确匹配开头或结尾的部分。 另外,可能有用户不知道要自己加通配符,所以需要提醒他们。比如,如果用户输入的是“张”,那么在查询的时候,应该在前后加上%,变成'%张%',这样才能匹配中间出现的部分。或者,如果用户想匹配开头,就只在后面加%,比如'张%'。 然后,可能还需要提到使用ilike进行不区分大小写的查询,比如在某些数据库中,like是区分大小写的,而ilike不区分。但要注意数据库的支持情况,比如SQLite不支持ilike,而PostgreSQL支持。 还有,有没有更简洁的方式?比如使用contains方法,我记得SQLAlchemy的列属性有contains,它会自动添加%通配符。例如,User.name.contains('张')会生成name LIKE '%张%'。这可能更方便,用户不需要手动处理百分号,这样更不容易出错。这一点很要,应该强调一下,因为用户可能更喜欢这种方式。 同样的,startswith和endswith方法可以分别生成keyword%和%keyword,这样用户不需要自己拼接字符串。比如User.name.startswith('张')生成name LIKE '张%',而User.name.endswith('张')生成name LIKE '%张'。这些方法可能更直观,也更安全,避免用户忘记加通配符。 接下来,关于Core的使用方式,比如使用table.c.column的方式,例如select(users).where(users.c.name.like('%张%'))。这里同样可以用contains、startswith等方法,或者手动加通配符。 另外,可能需要提到转义特殊字符的情况,比如如果用户的关键字中包含%或者_,需要使用escape字符。比如,要查找包含“100%”的名字,应该写成like('%100\%%', escape='\'),这样数据库会把%当作普通字符处理。这部分可能属于进阶内容,但用户可能遇到这个问题,所以最好简单提一下,给出示例。 最后,总结一下步骤:确定使用ORM还是Core,选择合适的方法(like、contains等),处理通配符,注意大小写敏感性,处理特殊字符的转义。然后给出几个具体的例子,覆盖不同情况,比如中间匹配、开头匹配、结尾匹配,以及不区分大小写的查询。 还要检查是否有其他方法或者常见的陷阱,比如性能问题,模糊查询可能导致全表扫描,所以在大型表中要注意索引的使用,但这是数据库层面的优化,可能超出SQLAlchemy的范围,但用户可能想知道,所以可以稍微提一下,但不需要深入。 综上所述,回答应该结构清晰,分点说明不同的方法,举例说明,提醒注意事项,比如通配符的位置、大小写、转义等,以及推荐使用contains等方法简化操作。</think>在 SQLAlchemy 中实现模糊查询主要通过 `LIKE` 操作符结合通配符 `%` 或 `_`,以下是具体方法和步骤: --- ### 一、基础语法(ORM 方式) 假设有一个 `User` 模型,字段为 `name`,查询名字包含 "张" 的记录: ```python from sqlalchemy import or_ # 1. 直接使用 like() 方法 result = session.query(User).filter(User.name.like('%张%')).all() # 2. 更简洁的方式:contains() 自动添加两侧 % result = session.query(User).filter(User.name.contains('张')).all() # 3. 匹配开头或结尾 result = session.query(User).filter(User.name.startswith('张')).all() # 张% result = session.query(User).filter(User.name.endswith('张')).all() # %张 # 4. 不区分大小写(需数据库支持,如 PostgreSQL) result = session.query(User).filter(User.name.ilike('%zhang%')).all() ``` --- ### 二、结合变量动态查询 若关键字是变量,可通过字符串格式化安全处理: ```python keyword = "张" result = session.query(User).filter(User.name.like(f'%{keyword}%')).all() # 或使用 contains result = session.query(User).filter(User.name.contains(keyword)).all() ``` --- ### 三、使用 SQL 表达式(Core 方式) 若直接操作数据表对象: ```python from sqlalchemy import select users = Table('users', metadata, autoload=True) stmt = select(users).where(users.c.name.like('%张%')) result = connection.execute(stmt).fetchall() ``` --- ### 四、多条件模糊查询 结合 `or_` 或 `and_` 实现复杂逻辑: ```python from sqlalchemy import or_ result = session.query(User).filter( or_( User.name.contains('张'), User.email.contains('example.com') ) ).all() ``` --- ### 五、转义特殊字符 若关键字包含 `%` 或 `_` 时,需使用 `escape` 参数: ```python result = session.query(User).filter( User.name.like('100\%折扣%', escape='\\') ).all() ``` --- ### 注意事项 1. **通配符说明**: - `%`:匹配任意长度字符(包括空字符) - `_`:匹配单个字符 2. **性能优化**:模糊查询可能触发全表扫描,大数据量时建议结合索引优化。 3. **区分大小写**:`LIKE` 在多数数据库(如 MySQL)中区分大小写,`ILIKE`(如 PostgreSQL)则不区分。 通过上述方法,可灵活实现 SQLAlchemy 的模糊查询需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值