#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/4/9 8:27
# @Author : old tom
# @File : metadata_dao.py
# @Project : futool-tiny-datahub
# @Desc :
from common . fudb . connectors . connector_factory import ConnFactory
from common . fudb . dbapis . fu_dao import BaseDao
class MetadataDao ( BaseDao ) :
def __init__ ( self , connector : ConnFactory ) :
super ( ) . __init__ ( connector )
def query_all_tables ( self , sql ) :
"""
查询所有表
: param sql :
: return :
"""
return self . query_all ( sql )
def query_all_views ( self , sql ) :
"""
查询所有视图
: param sql :
: return :
"""
return self . query_all ( sql )
def query_all_procedure ( self , sql ) :
"""
查询所有存储过程
: param sql :
: return :
"""
return self . query_all ( sql )
def query_procedure_detail ( self , sql ) :
"""
查询视图及存储过程明细
: param sql :
: return :
"""
rt = self . query_all ( sql )
# 合并为完整SQL
return ' create or replace ' + ( ' ' . join ( [ str ( x [ 0 ] ) . replace ( ' \n ' , ' \r ' ) for x in rt ] ) )
def query_view_detail ( self , view_name , sql ) :
"""
查询视图创建语句
: param view_name :
: param sql :
: return :
"""
return f ' CREATE OR REPLACE VIEW { view_name } AS ' + ' \r \n ' + self . query_one ( sql ) [ 0 ]
def query_table_field ( self , sql ) :
"""
查询表字段
: param sql :
: return :
"""
return self . query_all ( sql )
def save_table_fields ( self , data ) :
"""
保存表字段
: param data :
: return :
"""
return self . batch_insert (
sql_tpl = ' insert into metadata_object_field(meta_id,field_name,field_ch_name,order_num,field_type,nullable,default_value,field_length) values %s ' ,
data = data , batch_size = 1500 )
def save_metadata_obj ( self , objs ) :
"""
保存元数据
: param objs :
: return :
"""
return self . batch_insert (
sql_tpl = ' insert into metadata_object(meta_id,source_id,meta_type,meta_name,meta_ch_name,version_code) values %s ' ,
data = objs , batch_size = 1500 )
def save_metadata_create ( self , details ) :
return self . batch_insert (
sql_tpl = ' insert into metadata_object_create(meta_id,create_sql) values %s ' ,
data = details , batch_size = 1500 )
@staticmethod
def _get_version_sql ( source_id , version_code = None ) :
return ' and ' + ( f ' version_code= { version_code } ' if version_code \
else f " version_code=(select max(version_code) from metadata_object_version_record where source_id= ' { source_id } ' ) " )
def query_metadata_by_type ( self , obj_type ) :
return self . query_all (
f " select * from metadata_object where meta_type= ' { obj_type } ' " ) if obj_type else self . query_all (
' select * from metadata_object ' )
def query_metadata_name_by_type ( self , obj_type , source_id , version_code = None ) :
"""
查询元数据名称
: param version_code : 版本号 , 默认查最新
: param source_id : 源ID
: param obj_type : 类型
: return :
"""
sql = f " select meta_name from metadata_object where source_id= ' { source_id } ' and meta_type= ' { obj_type } ' " + self . _get_version_sql (
source_id , version_code )
return [ x [ 0 ] for x in self . query_all ( sql ) ]
def query_metadata_id_name ( self , obj_type , source_id , version_code = None ) :
"""
查询元数据meta_id及meta_name
: param obj_type :
: param source_id :
: param version_code : 版本号
: return :
"""
sql = f " select meta_id,meta_name from metadata_object where meta_type= ' { obj_type } ' " \
+ self . _get_version_sql ( source_id , version_code )
return self . query_all ( sql )
def query_metadata_create ( self , obj_type , meta_id , source_id ) :
"""
查询创建语句
: param obj_type :
: param meta_id :
: param source_id :
: return :
"""
# metadata_object_create与metadata_object非强外键关系, 所以加入source_id保证查询结果正确
sql = f " select create_sql from metadata_object_create where meta_id in (select meta_id from metadata_object where meta_id= { meta_id } and source_id= ' { source_id } ' and meta_type= ' { obj_type } ' ) "
create_sql = self . query_one ( sql )
return create_sql [ 0 ] if create_sql and len ( create_sql ) > 0 else ' '
def query_metadata_create_by_name ( self , meta_name , source_id , version_code = None ) :
"""
名称查询创建语句
: param version_code : 版本号
: param meta_name :
: param source_id :
: return :
"""
sql = f " select create_sql from metadata_object_create where meta_id=(select meta_id from metadata_object where meta_name= ' { meta_name } ' and source_id= ' { source_id } ' " + self . _get_version_sql (
source_id , version_code ) + " ) "
create_sql = self . query_one ( sql )
return create_sql [ 0 ] if create_sql and len ( create_sql ) > 0 else ' '
def query_metadata_type ( self , meta_id , source_id , version_code = None ) :
"""
查询元数据类型
: param version_code : 版本号
: param meta_id :
: param source_id :
: return :
"""
sql = f " select meta_type from metadata_object where meta_id= { meta_id } and source_id= ' { source_id } ' " \
+ self . _get_version_sql ( source_id , version_code )
rt = self . query_one ( sql )
return rt [ 0 ] if rt and len ( rt ) > 0 else None
def query_metadata_type_by_name ( self , meta_name , source_id , version_code = None ) :
"""
根据元数据名称查询类型
: param version_code : 版本号
: param meta_name : 元数据名
: param source_id : 源ID
: return :
"""
sql = f " select meta_type from metadata_object where meta_name= ' { meta_name } ' and source_id= ' { source_id } ' " \
+ self . _get_version_sql ( source_id , version_code )
rt = self . query_one ( sql )
return rt [ 0 ] if rt and len ( rt ) > 0 else None
def remove_metadata_by_version ( self , source_id , version_code ) :
"""
根据版本号删除元数据
: param source_id :
: param version_code :
: return :
"""
del_version_sql = f " delete from metadata_object_version_record where source_id = ' { source_id } ' AND version_code = { version_code } "
del_metadata_obj_field_detail = f " delete from metadata_object_field where meta_id in (SELECT meta_id FROM metadata_object WHERE source_id = ' { source_id } ' AND version_code = { version_code } ) "
del_metadata_obj_create_detail = f " delete from metadata_object_create where meta_id in (SELECT meta_id FROM metadata_object WHERE source_id = ' { source_id } ' AND version_code = { version_code } ) "
del_metadata_obj = f " delete from metadata_object where source_id = ' { source_id } ' AND version_code = { version_code } "
self . execute_update_tx (
[ del_version_sql , del_metadata_obj_field_detail , del_metadata_obj_create_detail , del_metadata_obj ] )
def query_metadata_table_files ( self , source_id , table_name , version_code ) :
"""
查询表字段
: param source_id :
: param table_name :
: param version_code :
: return :
"""
sql = f " select field_name, field_ch_name, field_type, nullable, default_value, field_length " \
f " from metadata_object_field where meta_id in (select meta_id from metadata_object " \
f " where meta_type= ' table ' and meta_name= ' { table_name } ' and source_id = ' { source_id } ' " \
f " AND version_code = { version_code } ) "
return self . query_all ( sql )