基于CSV数据库列,用Python实现分服务器数据库操作的问题
基于数据库名执行跨服务器表删除操作的Python实现
核心需求
读取包含databasename和tablename列的file.csv,根据数据库名连接对应服务器,对指定表执行删除操作:
- 当
databasename为db1时,连接server a - 当
databasename为db2时,连接server b
方法一:使用Pandas处理CSV
Pandas读取CSV后,通过iterrows()遍历每一行数据,结合数据库驱动完成操作:
import pandas as pd # 根据你的数据库类型替换驱动,比如MySQL用pymysql,Oracle用cx_Oracle import pyodbc # 读取CSV文件,确保列名与CSV中一致 df = pd.read_csv("file.csv") # 预定义不同数据库的连接字符串,替换为你的实际配置 conn_config = { "db1": "DRIVER={ODBC Driver 17 for SQL Server};SERVER=server_a;DATABASE=db1;UID=你的用户名;PWD=你的密码", "db2": "DRIVER={ODBC Driver 17 for SQL Server};SERVER=server_b;DATABASE=db2;UID=你的用户名;PWD=你的密码" } # 遍历每一行数据 for _, row in df.iterrows(): db_name = row["databasename"] table_name = row["tablename"] # 跳过未配置的数据库 if db_name not in conn_config: print(f"跳过未知数据库:{db_name}") continue # 执行删除操作 try: # 建立连接 conn = pyodbc.connect(conn_config[db_name]) cursor = conn.cursor() # 构造删除SQL,用方括号包裹表名避免特殊字符冲突 delete_sql = f"DELETE FROM [{table_name}]" cursor.execute(delete_sql) conn.commit() print(f"已成功删除 {db_name}.{table_name} 的数据") except Exception as err: print(f"处理 {db_name}.{table_name} 失败:{str(err)}") # 出错时回滚事务 if conn: conn.rollback() finally: # 确保连接关闭 if conn: conn.close()
方法二:使用标准库csv模块
如果不想依赖Pandas,直接用Python内置的csv模块读取数据:
import csv import pyodbc # 数据库连接配置 conn_config = { "db1": "DRIVER={ODBC Driver 17 for SQL Server};SERVER=server_a;DATABASE=db1;UID=你的用户名;PWD=你的密码", "db2": "DRIVER={ODBC Driver 17 for SQL Server};SERVER=server_b;DATABASE=db2;UID=你的用户名;PWD=你的密码" } # 读取CSV文件 with open('file.csv', 'r', newline='', encoding='utf-8') as csv_file: # 用DictReader按列名读取数据 reader = csv.DictReader(csv_file) for row in reader: db_name = row["databasename"] table_name = row["tablename"] if db_name not in conn_config: print(f"跳过未知数据库:{db_name}") continue try: conn = pyodbc.connect(conn_config[db_name]) cursor = conn.cursor() delete_sql = f"DELETE FROM [{table_name}]" cursor.execute(delete_sql) conn.commit() print(f"已成功删除 {db_name}.{table_name} 的数据") except Exception as err: print(f"处理 {db_name}.{table_name} 失败:{str(err)}") if conn: conn.rollback() finally: if conn: conn.close()
关键注意事项
- 数据库驱动适配:示例用的是SQL Server的ODBC驱动,若使用其他数据库,需替换对应的驱动库(如MySQL用
pymysql,PostgreSQL用psycopg2) - SQL注入防护:如果CSV中的表名不可信,需先验证表名合法性,避免注入风险
- 事务安全:执行删除后必须
commit,出错时要rollback,避免数据不一致 - 列名匹配:确保CSV中的列名与代码中
databasename、tablename完全一致(区分大小写)
内容的提问来源于stack exchange,提问作者DIVYA
相关产品推荐
相关产品推荐

