88
99from .exceptions import UnknownOrderType , UnknownColumn , UpdateColumnEmptyException
1010from .type import Ordering
11- from .utils import clean_input_fields
11+ from .utils import clean_input_fields , path_query_builder
1212from .utils import find_query_builder
1313
1414
1515class SQLAlchemyGeneralSQLQueryService (ABC ):
1616
17- def __init__ (self , * , model , async_mode ):
17+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
1818
1919 """
2020 :param model: declarative_base model
@@ -24,24 +24,32 @@ def __init__(self, *, model, async_mode):
2424 self .model = model
2525 self .model_columns = model
2626 self .async_mode = async_mode
27+ self .foreign_table_mapping = foreign_table_mapping
2728
2829 def get_many (self , * ,
2930 join_mode ,
3031 query ,
32+ target_model = None ,
33+ abstract_param = None
3134 ) -> BinaryExpression :
3235 filter_args = query
3336 limit = filter_args .pop ('limit' , None )
3437 offset = filter_args .pop ('offset' , None )
3538 order_by_columns = filter_args .pop ('order_by_columns' , None )
39+ model = self .model
40+ if target_model :
41+ model = self .foreign_table_mapping [target_model ]
3642 filter_list : List [BinaryExpression ] = find_query_builder (param = filter_args ,
37- model = self .model_columns )
43+ model = model )
44+ path_filter_list : List [BinaryExpression ] = path_query_builder (params = abstract_param ,
45+ model = self .foreign_table_mapping )
3846 join_table_instance_list : list = self .get_join_select_fields (join_mode )
3947
40- model = self . model
48+
4149 if not isinstance (self .model , Table ):
4250 model = model .__table__
4351
44- stmt = select (* [model ] + join_table_instance_list ).filter (and_ (* filter_list ))
52+ stmt = select (* [model ] + join_table_instance_list ).filter (and_ (* filter_list + path_filter_list ))
4553 if order_by_columns :
4654 order_by_query_list = []
4755
@@ -79,7 +87,6 @@ def get_one(self, *,
7987 model = self .model
8088 if not isinstance (self .model , Table ):
8189 model = model .__table__
82- a = model .c ._all_columns
8390 stmt = select (* [model ] + join_table_instance_list ).where (and_ (* filter_list + extra_query_expression ))
8491 # stmt = session.query(*[model] + join_table_instance_list).filter(and_(*filter_list + extra_query_expression))
8592 stmt = self .get_join_by_excpression (stmt , join_mode = join_mode )
@@ -130,9 +137,9 @@ def get_join_select_fields(self, join_mode=None):
130137 if 'exclude' in local_reference and local_reference ['exclude' ]:
131138 continue
132139 for column in local_reference ['reference_table_columns' ]:
133- foreign_name = local_reference ['local ' ]['local_column ' ]
140+ foreign_table_name = local_reference ['reference ' ]['reference_table ' ]
134141 join_table_instance_list .append (
135- column .label (foreign_name + '_foreign_____' + str (column ).split ('.' )[1 ]))
142+ column .label (foreign_table_name + '_foreign_____' + str (column ).split ('.' )[1 ]))
136143 return join_table_instance_list
137144
138145 def get_join_by_excpression (self , stmt : BinaryExpression , join_mode = None ) -> BinaryExpression :
@@ -202,15 +209,16 @@ def model_query(self,
202209
203210class SQLAlchemyPGSQLQueryService (SQLAlchemyGeneralSQLQueryService ):
204211
205- def __init__ (self , * , model , async_mode ):
212+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
206213
207214 """
208215 :param model: declarative_base model
209216 :param async_mode: bool
210217 """
211218 super (SQLAlchemyPGSQLQueryService ,
212219 self ).__init__ (model = model ,
213- async_mode = async_mode )
220+ async_mode = async_mode ,
221+ foreign_table_mapping = foreign_table_mapping )
214222 self .model = model
215223 self .model_columns = model
216224 self .async_mode = async_mode
@@ -255,13 +263,14 @@ def upsert(self, *,
255263
256264class SQLAlchemySQLITEQueryService (SQLAlchemyGeneralSQLQueryService ):
257265
258- def __init__ (self , * , model , async_mode ):
266+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
259267 """
260268 :param model: declarative_base model
261269 :param async_mode: bool
262270 """
263271 super ().__init__ (model = model ,
264- async_mode = async_mode )
272+ async_mode = async_mode ,
273+ foreign_table_mapping = foreign_table_mapping )
265274 self .model = model
266275 self .model_columns = model
267276 self .async_mode = async_mode
@@ -276,13 +285,14 @@ def upsert(self, *,
276285
277286class SQLAlchemyMySQLQueryService (SQLAlchemyGeneralSQLQueryService ):
278287
279- def __init__ (self , * , model , async_mode ):
288+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
280289 """
281290 :param model: declarative_base model
282291 :param async_mode: bool
283292 """
284293 super ().__init__ (model = model ,
285- async_mode = async_mode )
294+ async_mode = async_mode ,
295+ foreign_table_mapping = foreign_table_mapping )
286296 self .model = model
287297 self .model_columns = model
288298 self .async_mode = async_mode
@@ -297,13 +307,14 @@ def upsert(self, *,
297307
298308class SQLAlchemyMariaDBQueryService (SQLAlchemyGeneralSQLQueryService ):
299309
300- def __init__ (self , * , model , async_mode ):
310+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
301311 """
302312 :param model: declarative_base model
303313 :param async_mode: bool
304314 """
305315 super ().__init__ (model = model ,
306- async_mode = async_mode )
316+ async_mode = async_mode ,
317+ foreign_table_mapping = foreign_table_mapping )
307318 self .model = model
308319 self .model_columns = model
309320 self .async_mode = async_mode
@@ -318,13 +329,14 @@ def upsert(self, *,
318329
319330class SQLAlchemyOracleQueryService (SQLAlchemyGeneralSQLQueryService ):
320331
321- def __init__ (self , * , model , async_mode ):
332+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
322333 """
323334 :param model: declarative_base model
324335 :param async_mode: bool
325336 """
326337 super ().__init__ (model = model ,
327- async_mode = async_mode )
338+ async_mode = async_mode ,
339+ foreign_table_mapping = foreign_table_mapping )
328340 self .model = model
329341 self .model_columns = model
330342 self .async_mode = async_mode
@@ -339,13 +351,14 @@ def upsert(self, *,
339351
340352class SQLAlchemyMSSqlQueryService (SQLAlchemyGeneralSQLQueryService ):
341353
342- def __init__ (self , * , model , async_mode ):
354+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
343355 """
344356 :param model: declarative_base model
345357 :param async_mode: bool
346358 """
347359 super ().__init__ (model = model ,
348- async_mode = async_mode )
360+ async_mode = async_mode ,
361+ foreign_table_mapping = foreign_table_mapping )
349362 self .model = model
350363 self .model_columns = model
351364 self .async_mode = async_mode
@@ -360,13 +373,14 @@ def upsert(self, *,
360373
361374class SQLAlchemyNotSupportQueryService (SQLAlchemyGeneralSQLQueryService ):
362375
363- def __init__ (self , * , model , async_mode ):
376+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
364377 """
365378 :param model: declarative_base model
366379 :param async_mode: bool
367380 """
368381 super ().__init__ (model = model ,
369- async_mode = async_mode )
382+ async_mode = async_mode ,
383+ foreign_table_mapping = foreign_table_mapping )
370384 self .model = model
371385 self .model_columns = model
372386 self .async_mode = async_mode
0 commit comments