|
|
@@ -30,7 +30,6 @@ CLI:
|
|
|
"""
|
|
|
import argparse
|
|
|
import os
|
|
|
-import re
|
|
|
import sys
|
|
|
from configparser import ConfigParser
|
|
|
from datetime import datetime
|
|
|
@@ -38,8 +37,7 @@ from datetime import datetime
|
|
|
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
|
sys.path.append(project_root)
|
|
|
|
|
|
-from dw_base.datax.datasources.data_source_factory import DataSourceFactory
|
|
|
-from dw_base.datax.datax_constants import DS_POSTGRE_SQL_JDBC_URL
|
|
|
+from dw_base.io.db import postgresql as pgdb
|
|
|
|
|
|
|
|
|
WORKSPACE_DEFAULT = os.path.join(
|
|
|
@@ -54,37 +52,12 @@ PROBE_SAMPLE_LIMIT = 1000
|
|
|
PROBE_SMALL_TABLE_THRESHOLD = 100000
|
|
|
|
|
|
|
|
|
-def resolve_datasource(ds_ref):
|
|
|
- """复用 plugin.py:34-42 的 ref → DataSource 解析逻辑。
|
|
|
-
|
|
|
- ds_ref 形如 'postgresql/prod-hobby',首段为 db_type(同父目录名)。
|
|
|
- datasource ini 落点:项目同级 ../datasource/{ds_ref}.ini。
|
|
|
- """
|
|
|
- ds_type = ds_ref.split('/')[0]
|
|
|
- if ds_type != 'postgresql':
|
|
|
- raise NotImplementedError('暂只支持 postgresql 数据源,收到: ' + ds_type)
|
|
|
- ds_file_path = os.path.normpath(
|
|
|
- os.path.join(project_root, '..', 'datasource', ds_ref + '.ini'))
|
|
|
- if not os.path.isfile(ds_file_path):
|
|
|
- raise FileNotFoundError('数据源 ini 不存在: ' + ds_file_path)
|
|
|
- return DataSourceFactory.get_data_source(ds_type, ds_file_path)
|
|
|
-
|
|
|
-
|
|
|
-def parse_jdbc_url(jdbc_url):
|
|
|
- """从 jdbc:postgresql://host:port/database 抽 (host, port, database)。"""
|
|
|
- m = re.match(r'jdbc:postgresql://([^:/]+)(?::(\d+))?/(.+)', jdbc_url)
|
|
|
- if not m:
|
|
|
- raise ValueError('无法解析 PG jdbcUrl: ' + jdbc_url)
|
|
|
- return m.group(1), int(m.group(2) or 5432), m.group(3)
|
|
|
-
|
|
|
-
|
|
|
def query_columns_full(conn, schema, table):
|
|
|
"""带序号 / 类型 / 主键标识的全字段 metadata 查询,按 attnum 排序。
|
|
|
|
|
|
返回 [(attnum, attname, comment, pg_type, pk_flag), ...]
|
|
|
"""
|
|
|
- cur = conn.cursor()
|
|
|
- cur.execute("""
|
|
|
+ return pgdb.query(conn, """
|
|
|
SELECT
|
|
|
a.attnum,
|
|
|
a.attname,
|
|
|
@@ -102,7 +75,6 @@ def query_columns_full(conn, schema, table):
|
|
|
AND a.attnum > 0 AND NOT a.attisdropped
|
|
|
ORDER BY a.attnum
|
|
|
""", (schema, table))
|
|
|
- return cur.fetchall()
|
|
|
|
|
|
|
|
|
def probe_table(conn, schema, table, full_rows):
|
|
|
@@ -373,18 +345,8 @@ def main():
|
|
|
sys.exit(2)
|
|
|
schema, table = args.t.split('.', 1)
|
|
|
|
|
|
- ds = resolve_datasource(args.ds)
|
|
|
- ds_dict = ds.parse()
|
|
|
- jdbc_url = ds_dict[DS_POSTGRE_SQL_JDBC_URL]
|
|
|
- user = ds_dict['username']
|
|
|
- password = ds_dict['password']
|
|
|
- host, port, database = parse_jdbc_url(jdbc_url)
|
|
|
-
|
|
|
- import pg8000.dbapi
|
|
|
- conn = pg8000.dbapi.connect(
|
|
|
- host=host, port=port, database=database,
|
|
|
- user=user, password=password,
|
|
|
- )
|
|
|
+ database = pgdb.resolve(args.ds)['database']
|
|
|
+ conn = pgdb.connect(args.ds)
|
|
|
try:
|
|
|
full_rows = query_columns_full(conn, schema, table)
|
|
|
if not full_rows:
|