def get_trgt_tb_crt_sql(self, trgt_tb_nm, trgt_db_cd="DPS", if_create_table=False): """ 根据源系统表结构生成目标系统的表结构语句,只适合简单的ods层同步表,不会获取索引、主键等信息 :param if_create_table: 是否直接创建表 :param trgt_tb_nm: 目标表表名 包含schema 例如dw.dim_date :param trgt_db_cd: :return: """ tb_strct = self.get_tb_strct() # meta = tb_strct.copy() # 源系统表结构 类型dataframe 'col_nm', 'col_type', 'col_len', 'col_prcn', 'col_cmnt' trgt_db_conn = Conn(trgt_db_cd) crt_tb_sql = crt_trgt_db_sql(tb_strct, trgt_tb_nm, trgt_db_cd=trgt_db_cd) if if_create_table: trgt_db_conn.upd_tb_strct(crt_tb_sql, schm_tb_nm=trgt_tb_nm, drop_direct=False) return crt_tb_sql # {"tb_nm": trgt_tb_nm, 'crt_tb_sql': crt_tb_sql, 'meta': meta}
def crt_tb_from_src_sys(self, src_tb_nm, src_db_cd, trgt_schm_nm='ods'): """ 数据同步时,源系统和目标表结构创建或者校验 :param src_tb_nm: :param src_db_cd: :param trgt_schm_nm: :return: """ trgt_tb_nm = self.tb_nm trgt_db_cd = self.conn.db_cd src_conn = Conn(src_db_cd) src_meta = src_conn.get_tb_strct(src_tb_nm) # 获取表结构 src_conn.close() if src_meta: if trgt_tb_nm is None: # 如果没有设定目标表名,需要自动生成目标表名 trgt_tb_nm = self.get_auto_el_tb_nm(schema=trgt_schm_nm) crt_tb_sql = crt_trgt_db_sql(src_meta, trgt_tb_nm, trgt_db_cd) trgt_conn = Conn(trgt_db_cd) rs = trgt_conn.upd_tb_strct(crt_tb_sql, schm_tb_nm=trgt_tb_nm, drop_direct=False) trgt_conn.close() return rs else: raise Exception("源数据库目标表表%s不存在" % src_tb_nm)
def deal(): """ 处理入口 """ conn = Conn(default_db_cd) crt_el_log_tb(conn) try: # 校验表结构 if conn.upd_tb_strct(crt_tb_sql=ddl_sql, schm_tb_nm=tb_nm, drop_direct=True): etl_meta_el(conn) finally: conn.close()
def deal(): """ 处理入口 :return: """ conn = Conn('ibm') try: with conn: # 表结构校验 if conn.upd_tb_strct(crt_tb_sql=ddl_sql, schm_tb_nm=tb_nm, drop_direct=proc_all_flag): # 产品分类 dim_prod_cat(conn) finally: conn.close()
def src_tb_sync_ods(src_tb_nm, src_db_cd, trgt_tb_nm=None, trgt_db_cd=default_db_cd, trgt_schm_nm='ods', if_el_data=True): """ 源系统和目标表结构创建或者校验 :param if_el_data: 是否导入数据 :param src_tb_nm: :param src_db_cd: :param trgt_tb_nm: :param trgt_db_cd: :param trgt_schm_nm: :return: """ src_conn = Conn(src_db_cd) src_meta = src_conn.get_tb_strct(src_tb_nm) # 获取表结构 src_conn.close() if src_meta: if trgt_tb_nm is None: # 如果没有设定目标表名,需要自动生成目标表名 trgt_tb_nm = get_targt_tb_nm(src_meta['tb_nm'], src_meta['db_cd'], schema=trgt_schm_nm) crt_tb_sql = crt_trgt_db_sql(src_meta, trgt_tb_nm, trgt_db_cd) trgt_conn = Conn(trgt_db_cd) rs = trgt_conn.upd_tb_strct(crt_tb_sql, schm_tb_nm=trgt_tb_nm, drop_direct=False) trgt_conn.close() if if_el_data: datax(src_tb_nm, src_db_cd, trgt_tb_nm, write_conn=trgt_db_cd, check_tb_strct=False, logs_print=False) return rs else: raise Exception("源数据库目标表表%s不存在" % src_tb_nm)
def to_check_tb_strct(src_tb_nm=None, src_db_cd=None, trgt_tb_nm=None, trgt_db_cd="DPS", if_ddl_not_exists="raise"): """ 校验表结构 :param if_ddl_not_exists: :param src_tb_nm: :param src_db_cd: :param trgt_tb_nm: :param trgt_db_cd: :return: """ sql = get_sql(trgt_tb_nm, sql_type='ddl') # 获取表结构的sql文件 if sql: # 存在sql文件时,以sql文件为主 if isinstance(trgt_db_cd, str): conn = Conn(trgt_db_cd) # get_conn(trgt_db_cd) else: conn = trgt_db_cd check_rs = conn.upd_tb_strct(sql, trgt_tb_nm) if check_rs is False: raise Exception("表结构校验不通过,请查看上面的错误明细") elif src_tb_nm and src_db_cd: err_msg = "根目录下的sql/ddl/" + trgt_tb_nm.replace( ".", "/") + ".sql文件不存在,从源系统拉取表结构校验" logger.warning(err_msg) src_tb_sync_ods(src_tb_nm, src_db_cd, trgt_tb_nm, trgt_db_cd, if_el_data=False) # 校验表结构并修改 else: err_msg = "根目录下的sql/ddl/" + trgt_tb_nm.replace(".", "/") + ".sql 文件不存在,无法校验" logger.warning(err_msg) if if_ddl_not_exists == "raise": # send_error_msg(err_msg, trgt_tb_nm) raise Exception(err_msg)