def create_column(column_dict, table): name = column_dict["name"] type_ = column_dict["type"] available_attrs = [ "autoincrement", "default", "doc", "key", "index", "info", "nullable", "onupdate", "primary_key", "server_default", "server_onupdate", "quote", "unique", "system", "comment", ] column_extras = {k: v for k, v in column_dict.items() if k in available_attrs} column = Column(name, type_, **column_extras) column.constraints = column_dict["constraints"] column.foreign_keys = column_dict["foreign_keys"] column.is_literal = column_dict["is_literal"] column.table = table return column
def ge_suite_to_sqla_columns(suite: str) -> dict: expectations = suite["expectations"] table_name = suite["expectation_suite_name"].split(".")[0] column_names = get_column_names(expectations) sqla_columns = [] for column_name in column_names: column = Column(name=column_name) all_columns_type_expectations = filter( lambda x: x["expectation_type"] == "expect_column_values_to_be_of_type", expectations) column_type_expectations = filter( lambda x: x["kwargs"]["column"] == column_name, all_columns_type_expectations) ge_type = list(column_type_expectations)[0]["kwargs"]["type_"] kwargs = {} if ge_type == "str": all_columns_length_expectations = filter( lambda x: x["expectation_type"] == "expect_column_value_lengths_to_be_between", expectations) column_length_expectations = list( filter(lambda x: x["kwargs"]["column"] == column_name, all_columns_length_expectations)) if len(column_length_expectations) == 1: length = column_length_expectations[0]["kwargs"]["max_value"] else: length = 100 kwargs = {"length": length} column.type = ge_to_sqla_types(ge_type, **kwargs) if column_name == "id" or column_name.endswith("_id"): column.primary_key = True if column_name.endswith( "_id") and column_name.split("_")[0] != table_name: foreign_table = column_name.split("_")[0] column.foreign_keys = [ForeignKey(f"{foreign_table}.id")] sqla_columns.append(column) return sqla_columns