diff --git a/vue-fastapi-backend/module_admin/service/metasecurity_service.py b/vue-fastapi-backend/module_admin/service/metasecurity_service.py index 73c67f1..abc7ff9 100644 --- a/vue-fastapi-backend/module_admin/service/metasecurity_service.py +++ b/vue-fastapi-backend/module_admin/service/metasecurity_service.py @@ -23,6 +23,7 @@ from sqlglot.expressions import Table from sqlglot import exp ,parse_one from typing import Set from sqlparse.tokens import Keyword, DML +from urllib.parse import quote_plus class MetaSecurityService: """ 数据源安全管理模块服务层 @@ -379,7 +380,9 @@ class MetaSecurityService: # 1️⃣ 去掉 jdbc 前缀 jdbc_prefixes = { "jdbc:mysql://": len("jdbc:mysql://"), - "jdbc:postgresql://": len("jdbc:postgresql://") + "jdbc:postgresql://": len("jdbc:postgresql://"), + "jdbc:oracle:thin:@//": len("jdbc:oracle:thin:@//"), + "jdbc:oracle:thin:@": len("jdbc:oracle:thin:@") } for prefix, length in jdbc_prefixes.items(): if address.startswith(prefix): @@ -410,6 +413,21 @@ class MetaSecurityService: pool_pre_ping=True, connect_args={"timeout": 5} # ⭐ 关键 ) + elif db_type.lower() == "oracle": + address = db_params["address"].lstrip("/") + user = quote_plus(db_params["user"]) + password = quote_plus(db_params["password"]) + connect_type = (db_params.get("connectType") or "").upper() + service_or_sid = quote_plus(db_params.get("database", "")) + if connect_type == "ORACLE_SID": + conn_str = f"oracle+oracledb://{user}:{password}@{address}/?sid={service_or_sid}" + else: + conn_str = f"oracle+oracledb://{user}:{password}@{address}/?service_name={service_or_sid}" + engine = create_async_engine( + conn_str, + pool_pre_ping=True, + connect_args={"transport_connect_timeout": 5} + ) else: raise ValueError("不支持的数据库类型") @@ -501,6 +519,14 @@ class MetaSecurityService: FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{table}' """ + elif db_type.lower() == "oracle": + query = f""" + SELECT COLUMN_NAME AS "column_name" + FROM ALL_TAB_COLUMNS + WHERE OWNER = UPPER('{schema}') + AND TABLE_NAME = UPPER('{table}') + ORDER BY COLUMN_ID + """ else: raise ValueError(f"暂不支持数据库类型: {db_type}") diff --git a/vue-fastapi-backend/requirements.txt b/vue-fastapi-backend/requirements.txt index 5d642c8..3d370ae 100644 --- a/vue-fastapi-backend/requirements.txt +++ b/vue-fastapi-backend/requirements.txt @@ -34,6 +34,7 @@ mdurl==0.1.2 minio==7.2.14 numpy==2.2.1 openpyxl==3.1.5 +oracledb==2.2.1 orjson==3.10.12 packaging==25.0 pandas==2.2.2 @@ -85,4 +86,4 @@ uvloop==0.21.0 watchfiles==1.0.3 wcwidth==0.2.13 websockets==14.1 -zope.interface==7.2 \ No newline at end of file +zope.interface==7.2 diff --git a/vue-fastapi-frontend/src/api/meta/metaInfo.js b/vue-fastapi-frontend/src/api/meta/metaInfo.js index bcdc5e1..8b82e4d 100644 --- a/vue-fastapi-frontend/src/api/meta/metaInfo.js +++ b/vue-fastapi-frontend/src/api/meta/metaInfo.js @@ -1,4 +1,5 @@ import request from '@/utils/request' +import cache from '@/plugins/cache' // 查询参数列表 export function getDataSourceList(query) { @@ -100,7 +101,17 @@ export function getProcData(param){ params: param }) } - +export function getschemaById(id) { + const query = { + userName: cache.local.get("username"), + password: cache.local.get("password") + } + return request({ + url: '/ds-api/dolphinscheduler/datasources/schemas?datasource='+id, + method: 'get', + headers: {dashUserName:query.userName,dashPassword:query.password} + }) +} diff --git a/vue-fastapi-frontend/src/views/meta/metatask/index.vue b/vue-fastapi-frontend/src/views/meta/metatask/index.vue index 7d417d8..61b2f3f 100644 --- a/vue-fastapi-frontend/src/views/meta/metatask/index.vue +++ b/vue-fastapi-frontend/src/views/meta/metatask/index.vue @@ -500,13 +500,22 @@ - + > + + @@ -568,6 +577,7 @@