@@ -68,51 +68,55 @@ class TransferHistory(Base):
6868 @classmethod
6969 @db_query
7070 def list_by_title (cls , db : Session , title : str , page : Optional [int ] = 1 , count : Optional [int ] = 30 ,
71- status : bool = None ):
72- if status is not None :
73- query = db . query ( cls ). filter (
74- cls .status == status
75- ). order_by (
76- cls .date . desc ()
71+ status : bool = None , wildcard : bool = False ):
72+ if wildcard :
73+ text_filter = or_ (
74+ cls .title . like ( title , escape = ' \\ ' ),
75+ cls . src . like ( title , escape = ' \\ ' ),
76+ cls .dest . like ( title , escape = ' \\ ' ),
7777 )
7878 else :
79- query = db . query ( cls ). filter ( or_ (
79+ text_filter = or_ (
8080 cls .title .like (f'%{ title } %' ),
8181 cls .src .like (f'%{ title } %' ),
8282 cls .dest .like (f'%{ title } %' ),
83- )).order_by (
84- cls .date .desc ()
8583 )
86-
84+ query = db .query (cls ).filter (text_filter )
85+ if status is not None :
86+ query = query .filter (cls .status == status )
87+ query = query .order_by (cls .date .desc ())
88+
8789 # 当count为负数时,不限制页数查询所有
8890 if count >= 0 :
8991 query = query .offset ((page - 1 ) * count ).limit (count )
90-
92+
9193 return query .all ()
9294
9395 @classmethod
9496 @async_db_query
9597 async def async_list_by_title (cls , db : AsyncSession , title : str , page : Optional [int ] = 1 , count : Optional [int ] = 30 ,
96- status : bool = None ):
97- if status is not None :
98- query = select ( cls ). filter (
99- cls .status == status
100- ). order_by (
101- cls .date . desc ()
98+ status : bool = None , wildcard : bool = False ):
99+ if wildcard :
100+ text_filter = or_ (
101+ cls .title . like ( title , escape = ' \\ ' ),
102+ cls . src . like ( title , escape = ' \\ ' ),
103+ cls .dest . like ( title , escape = ' \\ ' ),
102104 )
103105 else :
104- query = select ( cls ). filter ( or_ (
106+ text_filter = or_ (
105107 cls .title .like (f'%{ title } %' ),
106108 cls .src .like (f'%{ title } %' ),
107109 cls .dest .like (f'%{ title } %' ),
108- )).order_by (
109- cls .date .desc ()
110110 )
111-
111+ query = select (cls ).filter (text_filter )
112+ if status is not None :
113+ query = query .filter (cls .status == status )
114+ query = query .order_by (cls .date .desc ())
115+
112116 # 当count为负数时,不限制页数查询所有
113117 if count >= 0 :
114118 query = query .offset ((page - 1 ) * count ).limit (count )
115-
119+
116120 result = await db .execute (query )
117121 return result .scalars ().all ()
118122
@@ -232,31 +236,43 @@ async def async_count(cls, db: AsyncSession, status: bool = None):
232236
233237 @classmethod
234238 @db_query
235- def count_by_title (cls , db : Session , title : str , status : bool = None ):
236- if status is not None :
237- return db .query (func .count (cls .id )).filter (cls .status == status ).first ()[0 ]
239+ def count_by_title (cls , db : Session , title : str , status : bool = None , wildcard : bool = False ):
240+ if wildcard :
241+ text_filter = or_ (
242+ cls .title .like (title , escape = '\\ ' ),
243+ cls .src .like (title , escape = '\\ ' ),
244+ cls .dest .like (title , escape = '\\ ' ),
245+ )
238246 else :
239- return db . query ( func . count ( cls . id )). filter ( or_ (
247+ text_filter = or_ (
240248 cls .title .like (f'%{ title } %' ),
241249 cls .src .like (f'%{ title } %' ),
242- cls .dest .like (f'%{ title } %' )
243- )).first ()[0 ]
250+ cls .dest .like (f'%{ title } %' ),
251+ )
252+ query = db .query (func .count (cls .id )).filter (text_filter )
253+ if status is not None :
254+ query = query .filter (cls .status == status )
255+ return query .first ()[0 ]
244256
245257 @classmethod
246258 @async_db_query
247- async def async_count_by_title (cls , db : AsyncSession , title : str , status : bool = None ):
248- if status is not None :
249- result = await db .execute (
250- select (func .count (cls .id )).filter (cls .status == status )
259+ async def async_count_by_title (cls , db : AsyncSession , title : str , status : bool = None , wildcard : bool = False ):
260+ if wildcard :
261+ text_filter = or_ (
262+ cls .title .like (title , escape = '\\ ' ),
263+ cls .src .like (title , escape = '\\ ' ),
264+ cls .dest .like (title , escape = '\\ ' ),
251265 )
252266 else :
253- result = await db .execute (
254- select (func .count (cls .id )).filter (or_ (
255- cls .title .like (f'%{ title } %' ),
256- cls .src .like (f'%{ title } %' ),
257- cls .dest .like (f'%{ title } %' )
258- ))
267+ text_filter = or_ (
268+ cls .title .like (f'%{ title } %' ),
269+ cls .src .like (f'%{ title } %' ),
270+ cls .dest .like (f'%{ title } %' ),
259271 )
272+ stmt = select (func .count (cls .id )).filter (text_filter )
273+ if status is not None :
274+ stmt = stmt .filter (cls .status == status )
275+ result = await db .execute (stmt )
260276 return result .scalar ()
261277
262278 @classmethod
0 commit comments