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 :
@@ -182,6 +189,28 @@ def model_query(self,
182189 stmt = select (self .model ).where (and_ (* filter_list ))
183190 return stmt
184191
192+ def get_one_with_foreign_pk (self , * ,
193+ join_mode ,
194+ query ,
195+ target_model ,
196+ abstract_param = None
197+ ) -> BinaryExpression :
198+ model = self .foreign_table_mapping [target_model ]
199+ filter_list : List [BinaryExpression ] = find_query_builder (param = query ,
200+ model = model )
201+ path_filter_list : List [BinaryExpression ] = path_query_builder (params = abstract_param ,
202+ model = self .foreign_table_mapping )
203+ join_table_instance_list : list = self .get_join_select_fields (join_mode )
204+
205+ if not isinstance (self .model , Table ):
206+ model = model .__table__
207+
208+ stmt = select (* [model ] + join_table_instance_list ).filter (and_ (* filter_list + path_filter_list ))
209+
210+ stmt = self .get_join_by_excpression (stmt , join_mode = join_mode )
211+ return stmt
212+
213+
185214 # def update(self, *,
186215 # update_args,
187216 # extra_query,
@@ -202,15 +231,16 @@ def model_query(self,
202231
203232class SQLAlchemyPGSQLQueryService (SQLAlchemyGeneralSQLQueryService ):
204233
205- def __init__ (self , * , model , async_mode ):
234+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
206235
207236 """
208237 :param model: declarative_base model
209238 :param async_mode: bool
210239 """
211240 super (SQLAlchemyPGSQLQueryService ,
212241 self ).__init__ (model = model ,
213- async_mode = async_mode )
242+ async_mode = async_mode ,
243+ foreign_table_mapping = foreign_table_mapping )
214244 self .model = model
215245 self .model_columns = model
216246 self .async_mode = async_mode
@@ -255,13 +285,14 @@ def upsert(self, *,
255285
256286class SQLAlchemySQLITEQueryService (SQLAlchemyGeneralSQLQueryService ):
257287
258- def __init__ (self , * , model , async_mode ):
288+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
259289 """
260290 :param model: declarative_base model
261291 :param async_mode: bool
262292 """
263293 super ().__init__ (model = model ,
264- async_mode = async_mode )
294+ async_mode = async_mode ,
295+ foreign_table_mapping = foreign_table_mapping )
265296 self .model = model
266297 self .model_columns = model
267298 self .async_mode = async_mode
@@ -276,13 +307,14 @@ def upsert(self, *,
276307
277308class SQLAlchemyMySQLQueryService (SQLAlchemyGeneralSQLQueryService ):
278309
279- def __init__ (self , * , model , async_mode ):
310+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
280311 """
281312 :param model: declarative_base model
282313 :param async_mode: bool
283314 """
284315 super ().__init__ (model = model ,
285- async_mode = async_mode )
316+ async_mode = async_mode ,
317+ foreign_table_mapping = foreign_table_mapping )
286318 self .model = model
287319 self .model_columns = model
288320 self .async_mode = async_mode
@@ -297,13 +329,14 @@ def upsert(self, *,
297329
298330class SQLAlchemyMariaDBQueryService (SQLAlchemyGeneralSQLQueryService ):
299331
300- def __init__ (self , * , model , async_mode ):
332+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
301333 """
302334 :param model: declarative_base model
303335 :param async_mode: bool
304336 """
305337 super ().__init__ (model = model ,
306- async_mode = async_mode )
338+ async_mode = async_mode ,
339+ foreign_table_mapping = foreign_table_mapping )
307340 self .model = model
308341 self .model_columns = model
309342 self .async_mode = async_mode
@@ -318,13 +351,14 @@ def upsert(self, *,
318351
319352class SQLAlchemyOracleQueryService (SQLAlchemyGeneralSQLQueryService ):
320353
321- def __init__ (self , * , model , async_mode ):
354+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
322355 """
323356 :param model: declarative_base model
324357 :param async_mode: bool
325358 """
326359 super ().__init__ (model = model ,
327- async_mode = async_mode )
360+ async_mode = async_mode ,
361+ foreign_table_mapping = foreign_table_mapping )
328362 self .model = model
329363 self .model_columns = model
330364 self .async_mode = async_mode
@@ -339,13 +373,14 @@ def upsert(self, *,
339373
340374class SQLAlchemyMSSqlQueryService (SQLAlchemyGeneralSQLQueryService ):
341375
342- def __init__ (self , * , model , async_mode ):
376+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
343377 """
344378 :param model: declarative_base model
345379 :param async_mode: bool
346380 """
347381 super ().__init__ (model = model ,
348- async_mode = async_mode )
382+ async_mode = async_mode ,
383+ foreign_table_mapping = foreign_table_mapping )
349384 self .model = model
350385 self .model_columns = model
351386 self .async_mode = async_mode
@@ -360,13 +395,14 @@ def upsert(self, *,
360395
361396class SQLAlchemyNotSupportQueryService (SQLAlchemyGeneralSQLQueryService ):
362397
363- def __init__ (self , * , model , async_mode ):
398+ def __init__ (self , * , model , async_mode , foreign_table_mapping ):
364399 """
365400 :param model: declarative_base model
366401 :param async_mode: bool
367402 """
368403 super ().__init__ (model = model ,
369- async_mode = async_mode )
404+ async_mode = async_mode ,
405+ foreign_table_mapping = foreign_table_mapping )
370406 self .model = model
371407 self .model_columns = model
372408 self .async_mode = async_mode
0 commit comments