@@ -8,9 +8,9 @@ SQLAlchemy CRUD Plus 支持 30+ 种过滤操作符,用于构建复杂的查询
88# 使用过滤条件查询
99users = await user_crud.select_models(
1010 session,
11- name = " 张三" , # 等于
12- age__gt = 18 , # 大于
13- email__like = " %@qq.com" # 模糊匹配
11+ name = " 张三" , # 等于
12+ age__gt = 18 , # 大于
13+ email__like = " %@qq.com" # 模糊匹配
1414)
1515```
1616
@@ -20,12 +20,12 @@ users = await user_crud.select_models(
2020# 数值比较
2121users = await user_crud.select_models(
2222 session,
23- age__gt = 30 , # 大于 30
24- age__ge = 18 , # 大于等于 18
25- age__lt = 65 , # 小于 65
26- age__le = 60 , # 小于等于 60
27- id__eq = 1 , # 等于 1
28- status__ne = 0 # 不等于 0
23+ age__gt = 30 , # 大于 30
24+ age__ge = 18 , # 大于等于 18
25+ age__lt = 65 , # 小于 65
26+ age__le = 60 , # 小于等于 60
27+ id__eq = 1 , # 等于 1
28+ status__ne = 0 # 不等于 0
2929)
3030```
3131
@@ -35,9 +35,9 @@ users = await user_crud.select_models(
3535# 包含查询
3636users = await user_crud.select_models(
3737 session,
38- id__in = [1 , 2 , 3 , 4 , 5 ], # ID 在列表中
39- status__not_in = [0 , - 1 ], # 状态不在列表中
40- age__between = [18 , 65 ] # 年龄在 18-65 之间
38+ id__in = [1 , 2 , 3 , 4 , 5 ], # ID 在列表中
39+ status__not_in = [0 , - 1 ], # 状态不在列表中
40+ age__between = [18 , 65 ] # 年龄在 18-65 之间
4141)
4242```
4343
@@ -47,12 +47,12 @@ users = await user_crud.select_models(
4747# 字符串匹配
4848users = await user_crud.select_models(
4949 session,
50- name__like = ' %张%' , # 包含"张"
51- name__not_like = ' %test%' , # 不包含"test"
52- name__ilike = ' %ADMIN%' , # 不区分大小写包含
53- email__startswith = ' admin' , # 以"admin"开头
54- email__endswith = ' @qq.com' , # 以"@qq.com"结尾
55- bio__contains = ' 程序员' , # 包含"程序员"
50+ name__like = ' %张%' , # 包含"张"
51+ name__not_like = ' %test%' , # 不包含"test"
52+ name__ilike = ' %ADMIN%' , # 不区分大小写包含
53+ email__startswith = ' admin' , # 以"admin"开头
54+ email__endswith = ' @qq.com' , # 以"@qq.com"结尾
55+ bio__contains = ' 程序员' , # 包含"程序员"
5656)
5757```
5858
@@ -62,8 +62,8 @@ users = await user_crud.select_models(
6262# NULL 值处理
6363users = await user_crud.select_models(
6464 session,
65- deleted_at__is = None , # 为 NULL
66- profile_id__is_not = None , # 不为 NULL
65+ deleted_at__is = None , # 为 NULL
66+ profile_id__is_not = None , # 不为 NULL
6767)
6868```
6969
@@ -102,9 +102,9 @@ users = await user_crud.select_models(
102102 session,
103103 is_active = True , # 必须是活跃用户
104104 __or__ = {
105- ' level__ge' : 5 , # 等级大于等于5
106- ' is_vip' : True , # 或者是VIP
107- ' total_spent__gt' : 1000 # 或者消费大于1000
105+ ' level__ge' : 5 , # 等级大于等于5
106+ ' is_vip' : True , # 或者是VIP
107+ ' total_spent__gt' : 1000 # 或者消费大于1000
108108 }
109109)
110110```
@@ -113,40 +113,40 @@ users = await user_crud.select_models(
113113
114114### 比较操作符
115115
116- | 操作符 | 说明 | 示例 |
117- | --------| ------| ------|
118- | ` __gt ` | 大于 | ` age__gt=18 ` |
119- | ` __ge ` | 大于等于 | ` age__ge=18 ` |
120- | ` __lt ` | 小于 | ` age__lt=65 ` |
121- | ` __le ` | 小于等于 | ` age__le=65 ` |
122- | ` __eq ` | 等于 | ` id__eq=1 ` |
123- | ` __ne ` | 不等于 | ` status__ne=0 ` |
116+ | 操作符 | 说明 | 示例 |
117+ | --------| ------| ---------------- |
118+ | ` __gt ` | 大于 | ` age__gt=18 ` |
119+ | ` __ge ` | 大于等于 | ` age__ge=18 ` |
120+ | ` __lt ` | 小于 | ` age__lt=65 ` |
121+ | ` __le ` | 小于等于 | ` age__le=65 ` |
122+ | ` __eq ` | 等于 | ` id__eq=1 ` |
123+ | ` __ne ` | 不等于 | ` status__ne=0 ` |
124124
125125### 包含操作符
126126
127- | 操作符 | 说明 | 示例 |
128- | --------| ------| ------|
129- | ` __in ` | 在列表中 | ` id__in=[1,2,3] ` |
130- | ` __not_in ` | 不在列表中 | ` id__not_in=[1,2,3] ` |
131- | ` __between ` | 在范围内 | ` age__between=[18,65] ` |
127+ | 操作符 | 说明 | 示例 |
128+ | ------------- | ------- | ------------------ ------|
129+ | ` __in ` | 在列表中 | ` id__in=[1,2,3] ` |
130+ | ` __not_in ` | 不在列表中 | ` id__not_in=[1,2,3] ` |
131+ | ` __between ` | 在范围内 | ` age__between=[18,65] ` |
132132
133133### 字符串操作符
134134
135- | 操作符 | 说明 | 示例 |
136- | --------| ------| ------|
137- | ` __like ` | 模糊匹配 | ` name__like='%张%' ` |
138- | ` __not_like ` | 模糊不匹配 | ` name__not_like='%test%' ` |
139- | ` __ilike ` | 不区分大小写模糊匹配 | ` name__ilike='%ZHANG%' ` |
140- | ` __not_ilike ` | 不区分大小写模糊不匹配 | ` name__not_ilike='%TEST%' ` |
141- | ` __startswith ` | 开头匹配 | ` email__startswith='admin' ` |
142- | ` __endswith ` | 结尾匹配 | ` email__endswith='@qq.com' ` |
143- | ` __contains ` | 包含 | ` name__contains='张' ` |
135+ | 操作符 | 说明 | 示例 |
136+ | ---------------- | ------------- | ----------------------- ------|
137+ | ` __like ` | 模糊匹配 | ` name__like='%张%' ` |
138+ | ` __not_like ` | 模糊不匹配 | ` name__not_like='%test%' ` |
139+ | ` __ilike ` | 不区分大小写模糊匹配 | ` name__ilike='%ZHANG%' ` |
140+ | ` __not_ilike ` | 不区分大小写模糊不匹配 | ` name__not_ilike='%TEST%' ` |
141+ | ` __startswith ` | 开头匹配 | ` email__startswith='admin' ` |
142+ | ` __endswith ` | 结尾匹配 | ` email__endswith='@qq.com' ` |
143+ | ` __contains ` | 包含 | ` name__contains='张' ` |
144144
145145### 空值操作符
146146
147- | 操作符 | 说明 | 示例 |
148- | --------| ------| ------|
149- | ` __is ` | 为空检查 | ` deleted_at__is=None ` |
147+ | 操作符 | 说明 | 示例 |
148+ | ------------ | ------- | --------------------- ------|
149+ | ` __is ` | 为空检查 | ` deleted_at__is=None ` |
150150| ` __is_not ` | 不为空检查 | ` deleted_at__is_not=None ` |
151151
152152## 实际应用示例
@@ -155,31 +155,31 @@ users = await user_crud.select_models(
155155
156156``` python
157157async def search_users (
158- session : AsyncSession,
159- keyword : str = None ,
160- age_min : int = None ,
161- age_max : int = None ,
162- is_active : bool = None
158+ session : AsyncSession,
159+ keyword : str = None ,
160+ age_min : int = None ,
161+ age_max : int = None ,
162+ is_active : bool = None
163163):
164164 filters = {}
165-
165+
166166 # 关键词搜索(姓名或邮箱)
167167 if keyword:
168168 filters[' __or__' ] = {
169169 ' name__like' : f ' % { keyword} % ' ,
170170 ' email__like' : f ' % { keyword} % '
171171 }
172-
172+
173173 # 年龄范围
174174 if age_min is not None :
175175 filters[' age__ge' ] = age_min
176176 if age_max is not None :
177177 filters[' age__le' ] = age_max
178-
178+
179179 # 状态筛选
180180 if is_active is not None :
181181 filters[' is_active' ] = is_active
182-
182+
183183 return await user_crud.select_models(session, ** filters)
184184```
185185
@@ -208,7 +208,7 @@ SQLAlchemy CRUD Plus 自动检测模型主键,支持单个主键和复合主
208208``` python
209209class UserRole (Base ):
210210 __tablename__ = ' user_roles'
211-
211+
212212 # 复合主键
213213 user_id: Mapped[int ] = mapped_column(primary_key = True )
214214 role_id: Mapped[int ] = mapped_column(primary_key = True )
@@ -247,11 +247,11 @@ user_roles = await user_role_crud.select_models(session, user_id=1)
247247# 为常用查询字段创建索引
248248class User (Base ):
249249 __tablename__ = ' users'
250-
250+
251251 email: Mapped[str ] = mapped_column(String(100 ), unique = True , index = True )
252252 is_active: Mapped[bool ] = mapped_column(default = True , index = True )
253253 created_at: Mapped[datetime] = mapped_column(DateTime, index = True )
254-
254+
255255 # 复合索引
256256 __table_args__ = (
257257 Index(' idx_user_active_created' , ' is_active' , ' created_at' ),
0 commit comments