@@ -96,8 +96,12 @@ def sql_alchemy_to_dict(
9696 sql_alchemy_object : Any ,
9797 for_frontend : bool = False ,
9898 column_whitelist : Optional [Iterable [str ]] = None ,
99+ column_blacklist : Optional [Iterable [str ]] = None ,
100+ column_rename_map : Optional [Dict [str , str ]] = None ,
99101):
100- result = __sql_alchemy_to_dict (sql_alchemy_object , column_whitelist )
102+ result = __sql_alchemy_to_dict (
103+ sql_alchemy_object , column_whitelist , column_blacklist , column_rename_map
104+ )
101105 if for_frontend :
102106 return to_frontend_obj (result )
103107 return result
@@ -136,26 +140,58 @@ def convert_value(value, max_lvl: int):
136140
137141
138142def __sql_alchemy_to_dict (
139- sql_alchemy_object : Any , column_whitelist : Optional [Iterable [str ]] = None
143+ sql_alchemy_object : Any ,
144+ column_whitelist : Optional [Iterable [str ]] = None ,
145+ column_blacklist : Optional [Iterable [str ]] = None ,
146+ column_rename_map : Optional [Dict [str , str ]] = None ,
140147):
148+ def rename_columns (data : Any ) -> Any :
149+ if column_rename_map :
150+ if isinstance (data , dict ):
151+ data = {
152+ column_rename_map .get (k , k ): rename_columns (v )
153+ for k , v in data .items ()
154+ }
155+ elif isinstance (data , list ):
156+ data = [rename_columns (item ) for item in data ]
157+ return data
158+
141159 if isinstance (sql_alchemy_object , list ):
142160 # list is for all() queries
143- return [__sql_alchemy_to_dict (x , column_whitelist ) for x in sql_alchemy_object ]
161+ return [
162+ __sql_alchemy_to_dict (
163+ x , column_whitelist , column_blacklist , column_rename_map
164+ )
165+ for x in sql_alchemy_object
166+ ]
144167
145168 elif isinstance (sql_alchemy_object , Row ):
146169 # basic SELECT .. FROM query)
147170 # _mapping is a RowMapping object that is not serializable but dict like
148- return {
171+ result = {
149172 k : v
150173 for k , v in dict (sql_alchemy_object ._mapping ).items ()
151- if not column_whitelist or k in column_whitelist
174+ if (not column_whitelist or k in column_whitelist )
175+ and (not column_blacklist or k not in column_blacklist )
152176 }
177+ return rename_columns (result )
153178 elif isinstance (sql_alchemy_object , Base ):
154- return {
179+ result = {
155180 c .name : getattr (sql_alchemy_object , c .name )
156181 for c in sql_alchemy_object .__table__ .columns
157- if not column_whitelist or c .name in column_whitelist
182+ if (not column_whitelist or c .name in column_whitelist )
183+ and (not column_blacklist or c .name not in column_blacklist )
184+ }
185+ return rename_columns (result )
186+ elif isinstance (sql_alchemy_object , dict ):
187+ result = {
188+ k : v
189+ for k , v in sql_alchemy_object .items ()
190+ if (not column_whitelist or k in column_whitelist )
191+ and (not column_blacklist or k not in column_blacklist )
158192 }
193+ return rename_columns (result )
194+
159195 else :
160196 return sql_alchemy_object
161197
0 commit comments