数据库连接信息 dsn = ( “(DESCRIPTION=” “(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.164.60)(PORT=1521)))” “(CONNECT_DATA=(SERVICE_NAME=YMSDB01)))” ) username = ‘acme’ password = ‘acme’ oracledb.init_oracle_client(lib_dir=r"C:\Users\Q06412\Downloads\instantclient-basic-windows.x64-21.17.0.0.0dbru\instantclient_21_17") connection = oracledb.connect(user=username, password=password, dsn=dsn) try: cursor = connection.cursor() sql_query = “”" select * FROM ACME.DRB_DATA “”" cursor.execute(sql_query) results = cursor.fetchall() drbdata = pd.DataFrame(results, columns=columns) site_columns = [f’SITE{i}_VAL’ for i in range(1, 26)] melted_data = drbdata.melt( id_vars=[‘DRB_ID’,‘PARAMETER_MAPPING’, ‘LOTNO’, ‘WAFER_NO’, ‘MEASURE_TIME’, ‘WAFER_TYPE’], value_vars=site_columns, var_name=‘SITE’, value_name=‘VALUE’) melted_data[‘VALUE’] = melted_data[‘VALUE’].astype(float) melted_data = melted_data.dropna(subset=[‘VALUE’]) grouped = melted_data.groupby(‘DRB_ID’) #drbid和lotno应该是一一对应的关系 for DRB_ID, lot_group in grouped: for param in lot_group[‘PARAMETER_MAPPING’].unique(): param_data = lot_group[lot_group[‘PARAMETER_MAPPING’] == param].copy() conditions = [ param_data[‘WAFER_TYPE’] == ‘DRB_WAFER’, param_data[‘WAFER_TYPE’] == ‘NONE_DRB_WAFER’ ] choices = [ param_data[‘LOTNO’].astype(str) + ‘-’ + param_data[‘WAFER_NO’].astype(str), param_data[‘LOTNO’].astype(str) + ‘-’ + param_data[‘WAFER_NO’].astype(str) ] tick_labels = np.select(conditions, choices, default=param_data[‘WAFER_TYPE’].astype(str) + ‘-’ + param_data[‘WAFER_NO’].astype(str)) 将标签添加到数据中并按标签分组 param_data[‘x_label’] = tick_labels sorted_data = param_data.sort_values(‘MEASURE_TIME’).copy() grouped_by_label = sorted_data.groupby(‘x_label’, sort=False) 同时过滤空分组 filtered_groups = [(name, group) for name, group in grouped_by_label if not group[‘VALUE’].empty] labels = [name for name, _ in filtered_groups] data = [group[‘VALUE’].values for _, group in filtered_groups] 创建绘图 plt.figure(figsize=(20, 10)) boxplot = plt.boxplot( data, tick_labels=labels, patch_artist=True, # 必须开启才能填充颜色 ) 设置图表属性 plt.title(f"DRB_ID: {DRB_ID} - Parameter: {param}") plt.xticks(rotation=90) plt.grid(True) #保存结果 datasave = f"H:/DRB/{DRB_ID}" if not os.path.exists(datasave): os.makedirs(datasave) box_save_dir = f"H:/DRB/{DRB_ID}/{param}.png" plt.savefig(box_save_dir, bbox_inches=‘tight’,dpi=300) plt.close() box_dir = f"H:/DRB/{DRB_ID}" prs = Presentation() slide_layout = prs.slide_layouts[6] # 空白版式 try: box_images = sorted( [os.path.join(box_dir, f) for f in os.listdir(box_dir) if f.endswith((‘.png’, ‘.jpg’, ‘.jpeg’))]) except FileExistsError: raise Exception(f"目录不存在:{box_dir}") total_pages = len(box_images) // 4 + 1 for page in range(total_pages): slide = prs.slides.add_slide(slide_layout) _add_images_to_slide( slide, box_images[page * 4: (page + 1) * 4], left_start=Inches(1.0), top_start=Inches(0.6), ) output_path = “H:/DRB” os.makedirs(os.path.dirname(output_path), exist_ok=True) if not os.path.exists(output_path): os.makedirs(output_path) prs.save(f"{output_path}/{DRB_ID}.pptx") #确认路径中是否包含{DRB_ID}.pptx,如果包含则update status=1 if contains_file(output_path, f"{DRB_ID}.pptx"): try: dsn = ( “(DESCRIPTION=” “(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.164.60)(PORT=1521)))” “(CONNECT_DATA=(SERVICE_NAME=YMSDB01)))” ) username = ‘acme’ password = ‘acme’ oracledb.init_oracle_client( lib_dir=r"C:\Users\Q06412\Downloads\instantclient-basic-windows.x64-21.17.0.0.0dbru\instantclient_21_17") connection2 = oracledb.connect(user=username, password=password, dsn=dsn) cursor = connection2.cursor() sql_query = """ update DRB_INFO_CONFIG set status = :1 where DRB_ID = :2 """ cursor.execute(sql_query, (1, f"{DRB_ID}")) connection2.commit() finally: if ‘connection2’ in locals(): connection2.close() except Exception as e: print(e) finally: cursor.close() connection.close() oracledb.exceptions.InterfaceError: DPY-1001: not connected to database
时间: 2025-07-04 21:45:12 浏览: 9
<think>嗯,用户给了一段Python代码,主要是连接Oracle数据库,执行查询,处理数据生成图表,然后更新数据库状态。现在需要我解释一下这段代码中的数据库连接信息部分。首先,我应该先仔细看看代码里的连接部分是怎么写的。
代码开头有dsn、username、password的设置。DSN的格式看起来是Oracle的连接字符串,用的是TCP协议,指定了HOST和PORT,还有SERVICE_NAME。用户可能不太清楚这些参数的具体含义,需要解释每个部分的作用。比如HOST是数据库服务器的IP地址,PORT是监听端口,SERVICE_NAME是数据库服务名。
接下来是oracledb.init_oracle_client,这里指定了Oracle客户端的路径。可能用户对为什么要初始化客户端有疑问,需要说明Oracle的Python驱动需要依赖客户端库,尤其是在Windows环境下,需要手动指定路径。
然后是用oracledb.connect建立连接,传入用户名、密码和DSN。这里需要注意的是代码里DSN是拼接成的字符串,可能用户会问这种写法是否正确,或者是否有其他方式配置DSN。同时,用户可能对连接过程的安全性有疑问,比如密码是否明文存储的风险。
在代码的后面,还有一个更新数据库状态的步骤,这里又创建了一个connection2,但看起来和之前的连接参数一样。用户可能会疑惑为什么需要另一个连接,是否有必要,或者是否应该复用原来的连接。另外,在finally块里关闭了连接,但如果在执行过程中出现异常,是否能正确释放资源也需要考虑。
另外,代码最后出现了接口错误DPY-1001,提示未连接到数据库。这可能是因为在某个地方连接已经关闭,或者在尝试操作时连接已经失效。需要检查所有连接是否正确关闭,特别是在异常处理部分是否有遗漏。
用户的问题主要是要求解释数据库连接信息,所以需要重点讲解DSN的组成、用户名密码的作用、Oracle客户端的初始化,以及连接过程中可能遇到的问题,比如驱动路径错误、网络不可达、权限问题等。同时,代码中的潜在问题,比如重复创建连接、异常处理是否完善,也需要指出。
还要注意用户提供的代码中有一些可能的错误,比如字符串使用了中文引号,比如“”"和“,这可能导致语法错误。此外,在文件路径处理中,是否有转义字符的问题,比如反斜杠需要双写或者使用原始字符串。这些虽然不是连接信息的核心,但可能影响代码运行,可以适当提及。
最后,用户可能想知道如何确保连接安全,比如使用环境变量存储密码,或者加密配置文件,这也是需要建议的最佳实践。同时,可以提到连接池或者上下文管理器(with语句)来管理连接,提高代码的健壮性。</think>以下是您提供的代码中关于数据库连接信息的逐层解析:
一、数据库连接核心配置
$$dsn = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.164.60)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=YMSDB01)))"$$
$$username = 'acme'$$
$$password = 'acme'$$
1. DSN(数据源名称)解析:
- 协议类型:$PROTOCOL=TCP$(使用TCP/IP协议)
- 服务器地址:$HOST=10.10.164.60$(数据库服务器IP)
- 端口号:$PORT=1521$(Oracle默认监听端口)
- 服务标识:$SERVICE_NAME=YMSDB01$(区别于SID的全局服务名)
2. 身份验证:
- 用户账号:$acme$
- 密码:$acme$(明文存储需注意安全风险)
二、Oracle客户端初始化
$$oracledb.init\_oracle\_client(lib\_dir=r"C:\...\instantclient\_21\_17")$$
- 必要性:Python驱动依赖Oracle Instant Client库
- 路径规范:使用原生字符串(r"")处理Windows路径反斜杠
- 版本要求:21c客户端(与21.17版本号对应)
三、连接建立与操作流程
```python
connection = oracledb.connect(user=username, password=password, dsn=dsn)
try:
cursor = connection.cursor()
# 数据操作...
finally:
connection.close()
```
四、关键注意点
1. 双连接问题:
- 主连接用于数据查询(`connection`)
- 更新操作新建连接`connection2`(建议复用连接)
2. 异常处理改进建议:
- 增加重试机制(网络闪断容错)
- 使用with语句自动管理资源
```python
with oracledb.connect(...) as conn:
with conn.cursor() as cursor:
# 数据库操作
```
3. 安全性增强:
- 密码不应硬编码(建议使用环境变量/配置文件加密)
- 连接字符串建议分离到配置文件
五、常见错误排查
1. DPY-1001错误分析:
- 过早关闭连接(如`connection2`在commit前关闭)
- 网络波动导致连接中断
- 防火墙阻断1521端口通信
2. 驱动问题:
- Instant Client路径验证
- 32/64位版本匹配
- PATH环境变量配置
六、架构优化建议
$$status = :1 \quad where \quad DRB\_ID = :2$$
- 使用连接池提升性能
- 参数化查询防止SQL注入
- 异步IO处理大数据量场景
建议通过以下方式验证连接有效性:
```python
import oracledb
try:
conn = oracledb.connect(...)
print(conn.version) # 输出版本信息即表示连接成功
finally:
conn.close()
```
阅读全文
相关推荐












