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 @@