|
8 | 8 | or_, \ |
9 | 9 | BinaryExpression |
10 | 10 |
|
| 11 | +from sqlalchemy.sql.schema import Table |
11 | 12 | from .crud_model import RequestResponseModel, CRUDModel |
12 | 13 | from .exceptions import QueryOperatorNotFound, PrimaryMissing, UnknownColumn |
13 | 14 | from .schema_builder import ApiParameterSchemaBuilder |
|
31 | 32 | 'find_query_builder', |
32 | 33 | 'Base', |
33 | 34 | 'clean_input_fields', |
34 | | - 'group_find_many_join'] |
| 35 | + 'group_find_many_join', |
| 36 | + 'convert_table_to_model'] |
35 | 37 |
|
36 | 38 | unsupported_data_types = ["BLOB"] |
37 | 39 | partial_supported_data_types = ["INTERVAL", "JSON", "JSONB"] |
@@ -94,101 +96,15 @@ def find_query_builder(param: dict, model: Base) -> List[Union[BinaryExpression] |
94 | 96 | class OrmConfig(BaseConfig): |
95 | 97 | orm_mode = True |
96 | 98 |
|
97 | | - |
98 | | -# def sqlalchemy_table_to_pydantic(db_model: Type, *, crud_methods: List[CrudMethods], |
99 | | -# exclude_columns: List[str] = None) -> CRUDModel: |
100 | | -# if exclude_columns is None: |
101 | | -# exclude_columns = [] |
102 | | -# request_response_mode_set = {} |
103 | | -# model_builder = ApiParameterSchemaBuilder_(db_model, |
104 | | -# exclude_column=exclude_columns) |
105 | | -# REQUIRE_PRIMARY_KEY_CRUD_METHOD = [CrudMethods.DELETE_ONE.value, |
106 | | -# CrudMethods.FIND_ONE.value, |
107 | | -# CrudMethods.PATCH_ONE.value, |
108 | | -# CrudMethods.POST_REDIRECT_GET.value, |
109 | | -# CrudMethods.UPDATE_ONE.value] |
110 | | -# for crud_method in crud_methods: |
111 | | -# request_url_param_model = None |
112 | | -# request_body_model = None |
113 | | -# response_model = None |
114 | | -# request_query_model = None |
115 | | -# if crud_method.value in REQUIRE_PRIMARY_KEY_CRUD_METHOD and not model_builder.primary_key_str: |
116 | | -# raise PrimaryMissing(f"The generation of this API [{crud_method.value}] requires a primary key") |
117 | | -# if crud_method.value == CrudMethods.UPSERT_ONE.value: |
118 | | -# request_query_model, \ |
119 | | -# request_body_model, \ |
120 | | -# response_model = model_builder.create_one() |
121 | | -# elif crud_method.value == CrudMethods.UPSERT_MANY.value: |
122 | | -# request_query_model, \ |
123 | | -# request_body_model, \ |
124 | | -# response_model = model_builder.create_many() |
125 | | -# elif crud_method.value == CrudMethods.DELETE_ONE.value: |
126 | | -# request_url_param_model, \ |
127 | | -# request_query_model, \ |
128 | | -# request_body_model, \ |
129 | | -# response_model = model_builder.delete_one() |
130 | | -# elif crud_method.value == CrudMethods.DELETE_MANY.value: |
131 | | -# request_url_param_model, \ |
132 | | -# request_query_model, \ |
133 | | -# request_body_model, \ |
134 | | -# response_model = model_builder.delete_many() |
135 | | -# elif crud_method.value == CrudMethods.FIND_ONE.value: |
136 | | -# request_url_param_model, \ |
137 | | -# request_query_model, \ |
138 | | -# request_body_model, \ |
139 | | -# response_model = model_builder.find_one() |
140 | | -# elif crud_method.value == CrudMethods.FIND_MANY.value: |
141 | | -# request_query_model, \ |
142 | | -# request_body_model, \ |
143 | | -# response_model = model_builder.find_many() |
144 | | -# elif crud_method.value == CrudMethods.POST_REDIRECT_GET.value: |
145 | | -# request_query_model, \ |
146 | | -# request_body_model, \ |
147 | | -# response_model = model_builder.post_redirect_get() |
148 | | -# elif crud_method.value == CrudMethods.PATCH_ONE.value: |
149 | | -# request_url_param_model, \ |
150 | | -# request_query_model, \ |
151 | | -# request_body_model, \ |
152 | | -# response_model = model_builder.patch() |
153 | | -# elif crud_method.value == CrudMethods.UPDATE_ONE.value: |
154 | | -# request_url_param_model, \ |
155 | | -# request_query_model, \ |
156 | | -# request_body_model, \ |
157 | | -# response_model = model_builder.update_one() |
158 | | -# elif crud_method.value == CrudMethods.UPDATE_MANY.value: |
159 | | -# request_url_param_model, \ |
160 | | -# request_query_model, \ |
161 | | -# request_body_model, \ |
162 | | -# response_model = model_builder.update_many() |
163 | | -# elif crud_method.value == CrudMethods.PATCH_MANY.value: |
164 | | -# request_url_param_model, \ |
165 | | -# request_query_model, \ |
166 | | -# request_body_model, \ |
167 | | -# response_model = model_builder.patch_many() |
168 | | -# |
169 | | -# request_response_models = {'requestBodyModel': request_body_model, |
170 | | -# 'responseModel': response_model, |
171 | | -# 'requestQueryModel': request_query_model, |
172 | | -# 'requestUrlParamModel': request_url_param_model} |
173 | | -# request_response_model = RequestResponseModel(**request_response_models) |
174 | | -# request_method = CRUDRequestMapping.get_request_method_by_crud_method(crud_method.value).value |
175 | | -# if request_method not in request_response_mode_set: |
176 | | -# request_response_mode_set[request_method] = {} |
177 | | -# request_response_mode_set[request_method][crud_method.value] = request_response_model |
178 | | -# return CRUDModel( |
179 | | -# **{**request_response_mode_set, |
180 | | -# **{"PRIMARY_KEY_NAME": model_builder.primary_key_str, |
181 | | -# "UNIQUE_LIST": model_builder.unique_fields}}) |
182 | | - |
183 | | - |
184 | | - |
185 | 99 | def sqlalchemy_to_pydantic( |
186 | 100 | db_model: Type, *, |
187 | 101 | crud_methods: List[CrudMethods], |
188 | 102 | sql_type: str = SqlType.postgresql, |
189 | 103 | exclude_columns: List[str] = None, |
190 | 104 | constraints = None, |
191 | 105 | exclude_primary_key=False) -> CRUDModel: |
| 106 | + |
| 107 | + db_model = convert_table_to_model(db_model) |
192 | 108 | if exclude_columns is None: |
193 | 109 | exclude_columns = [] |
194 | 110 | request_response_mode_set = {} |
@@ -407,3 +323,22 @@ def group_by_foreign_key(item): |
407 | 323 | result = {**i, **response} |
408 | 324 | response_list.append(result) |
409 | 325 | return response_list |
| 326 | + |
| 327 | +def convert_table_to_model(db_model): |
| 328 | + if not isinstance(db_model, Table): |
| 329 | + return db_model |
| 330 | + db_name = str(db_model.fullname) |
| 331 | + table_dict = {'__table__': db_model, |
| 332 | + '__tablename__': db_name} |
| 333 | + |
| 334 | + if not db_model.primary_key: |
| 335 | + table_dict['__mapper_args__'] = { |
| 336 | + "primary_key": [i for i in db_model._columns] |
| 337 | + } |
| 338 | + NO_PRIMARY_KEY = True |
| 339 | + |
| 340 | + for i in db_model.c: |
| 341 | + col, = i.expression.base_columns |
| 342 | + table_dict[str(i.key)] = col |
| 343 | + |
| 344 | + return type(f'{db_name}DeclarativeBaseClass', (declarative_base(),), table_dict) |
0 commit comments