Files
DashBoard/tools/test_oracle_connection.py
2026-02-08 08:30:48 +08:00

153 lines
4.4 KiB
Python

"""
Oracle Database Connection Test Script
测试连接到 DWDB 数据库并验证 MES 表访问权限
"""
import sys
import io
import os
import oracledb
from datetime import datetime
from pathlib import Path
# 设置 UTF-8 编码输出
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
# Load .env file
try:
from dotenv import load_dotenv
env_path = Path(__file__).resolve().parent.parent / '.env'
load_dotenv(env_path)
except ImportError:
pass
# 数据库连接信息 (从环境变量读取,必须在 .env 中设置)
DB_HOST = os.getenv('DB_HOST', '')
DB_PORT = os.getenv('DB_PORT', '1521')
DB_SERVICE = os.getenv('DB_SERVICE', '')
DB_USER = os.getenv('DB_USER', '')
DB_PASSWORD = os.getenv('DB_PASSWORD', '')
DB_CONFIG = {
'user': DB_USER,
'password': DB_PASSWORD,
'dsn': f'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST={DB_HOST})(PORT={DB_PORT})))(CONNECT_DATA=(SERVICE_NAME={DB_SERVICE})))'
}
# MES 表列表
MES_TABLES = [
'DW_MES_CONTAINER',
'DW_MES_HOLDRELEASEHISTORY',
'DW_MES_JOB',
'DW_MES_LOTREJECTHISTORY',
'DW_MES_LOTWIPDATAHISTORY',
'DW_MES_LOTWIPHISTORY',
'DW_MES_MAINTENANCE',
'DW_MES_PARTREQUESTORDER',
'DW_MES_PJ_COMBINEDASSYLOTS',
'DW_MES_RESOURCESTATUS',
'DW_MES_RESOURCESTATUS_SHIFT',
'DW_MES_WIP',
'DW_MES_HM_LOTMOVEOUT',
'DW_MES_JOBTXNHISTORY',
'DW_MES_LOTMATERIALSHISTORY',
'DW_MES_RESOURCE'
]
def test_connection():
"""测试数据库连接"""
print("=" * 60)
print("Oracle Database Connection Test")
print("=" * 60)
print(f"Test Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print(f"Host: {DB_HOST}:{DB_PORT}")
print(f"Service Name: {DB_SERVICE}")
print(f"User: {DB_USER}")
print("=" * 60)
try:
# 尝试连接数据库
print("\n[1/3] Attempting to connect to database...")
connection = oracledb.connect(**DB_CONFIG)
print("[OK] Connection successful!")
# 获取数据库版本信息
print("\n[2/3] Retrieving database version...")
cursor = connection.cursor()
cursor.execute("SELECT * FROM v$version WHERE banner LIKE 'Oracle%'")
version = cursor.fetchone()
if version:
print(f"[OK] Database Version: {version[0]}")
# 测试每个表的访问权限
print("\n[3/3] Testing access to MES tables...")
print("-" * 60)
accessible_tables = []
inaccessible_tables = []
for table_name in MES_TABLES:
try:
# 尝试查询表的行数
cursor.execute(f"SELECT COUNT(*) FROM {table_name}")
count = cursor.fetchone()[0]
print(f"[OK] {table_name:<35} - {count:,} rows")
accessible_tables.append(table_name)
except oracledb.DatabaseError as e:
error_obj, = e.args
print(f"[FAIL] {table_name:<35} - Error: {error_obj.message}")
inaccessible_tables.append((table_name, error_obj.message))
# 汇总结果
print("\n" + "=" * 60)
print("Test Summary")
print("=" * 60)
print(f"Total tables tested: {len(MES_TABLES)}")
print(f"Accessible tables: {len(accessible_tables)}")
print(f"Inaccessible tables: {len(inaccessible_tables)}")
if inaccessible_tables:
print("\nInaccessible Tables:")
for table, error in inaccessible_tables:
print(f" - {table}: {error}")
# 关闭连接
cursor.close()
connection.close()
print("\n[OK] Connection closed successfully")
return len(inaccessible_tables) == 0
except oracledb.DatabaseError as e:
error_obj, = e.args
print(f"\n[FAIL] Database Error: {error_obj.message}")
print(f" Error Code: {error_obj.code}")
return False
except Exception as e:
print(f"\n[FAIL] Unexpected Error: {str(e)}")
return False
def main():
"""主函数"""
try:
success = test_connection()
print("\n" + "=" * 60)
if success:
print("[SUCCESS] All tests passed successfully!")
else:
print("[WARNING] Some tests failed. Please check the output above.")
print("=" * 60)
except KeyboardInterrupt:
print("\n\nTest interrupted by user.")
except Exception as e:
print(f"\n\nFatal error: {str(e)}")
if __name__ == "__main__":
main()