def list_data_handler(cls, sql, data, **kwargs): """ ({list}) -> (#{list-1}, #{list-2}...) """ list_keys = SqlUtil.get_list_key(sql) if not list_keys: return sql logger.debug("[list_keys] %s", list_keys) for key in list_keys: value = data.pop(key) if isinstance(value, list): in_data = SqlUtil.get_list_data(key, value) # 确认没有交集才进行添加,否则会污染数据 if not data.keys().isdisjoint(in_data.keys()): raise Exception("有重复数据,不能进行添加") data.update(in_data) value = SqlUtil.get_value_str(in_data.keys()) sql = sql.replace(f"({{{key}}})", value) else: raise TypeErrorException() return sql
def auto_data_handler(cls, sql, data, **kwargs): """ @{key} :return: """ auto_keys = SqlUtil.get_auto_keys(sql) # 如果有需要替换的原样数据 if not auto_keys: return sql logger.debug("[auto_keys] %s", auto_keys) auto_data = {} for key in auto_keys: value = cls.AUTO_DATA_GETTER.get(key) if callable(value): value = value(data, sql) if value: auto_data[key] = value else: raise AutoDataNotFindException(key) return SqlUtil.auto_data_replace(sql, auto_data)
def query(cls, sql, data=None, **outer_kwargs): sql = cls._prepare_sql(sql, data, **outer_kwargs) data = cls._prepare_data(data, **outer_kwargs) logger.debug("[query] %s %s", sql, data) ignore_errors = cls.IGNORE_ERRORS + outer_kwargs.get( 'ignore_errors', ()) cursor = cls.execute(sql, data, ignore_errors=ignore_errors) return cls._prepare_cursor(cursor, **outer_kwargs)
def raw_data_handle(cls, sql, data, **kwargs): """ 原样数据 ${key} 优先级 data > class_object """ raw_keys = SqlUtil.get_raw_keys(sql) # 如果有需要替换的原样数据 if not raw_keys: return sql logger.debug("[raw_keys] %s", raw_keys) raw_data = {} # 从class_object 中获取数据 class_object = kwargs.get("class_object", None) if class_object: for key in raw_keys: if hasattr(class_object, key): raw_data[key] = getattr(class_object, key) # 从data中获取数据 if isinstance(data, dict): for key in raw_keys: if key in data: raw_data[key] = data.pop(key) # 数据检查 for key in raw_keys: if key not in raw_data.keys(): raise RawDataNotFindException(key) # 原样替换 return SqlUtil.raw_data_replace(sql, raw_data)
def handle(cls, cursor, **outer_kwargs): if hasattr(cursor, "statement"): logger.debug('[statement] %s', cursor.statement)
def close(cls): logger.debug("close database") cls.cursor.close() cls.connect.close()
def open(cls): logger.debug("open database") cls.connect = cls.DATABASE_CONNECTOR(**cls.DATABASE_CONFIG) cls.cursor = cls.connect.cursor(**cls.CURSOR_CONFIG)