背景说明
接到业务方需求,需要扫描一批mysql实例(登记在instance.csv文件中),并且按指定csv格式输出该实例中所有db的信息,输出到另外一份csv文件。
数据说明
数据输入
文件格式: csv
文件名: instance.csv
列头: id instance_name host port
数据输出
文件格式: csv
文件名: export.csv
列头: 实例名+dbName source_type jdbc_url db_name db_user password charge_user
涉及到的python知识点
- python读写csv文件(通过DictReader和DictWriter,将csv文件转换成dict)
- jaydebeapi操作mysql
- dict的使用
python源码
# 输入
# 文件格式: csv
# 文件名: instance.csv
# 0 1 4 5
# 列头: id instance_name host port
import csv
src_arr = []
with open('instance.csv', 'r') as f:
f_csv = csv.DictReader(f)
for row in f_csv:
src_arr.append(row)
# 数据处理
# print(src_arr)
out_arr = []
import jaydebeapi
user = "usr"
pwd = "password1"
driver = "com.mysql.jdbc.Driver"
jar_file = './mysql-connector-java-5.1.47.jar'
sql = "show databases"
for instance in src_arr:
out_instance = {}
try:
jdbc_url = "jdbc:mysql://" + instance['host'] + ":" + instance['port']
print("正在扫描" + instance['id'] + ", " + jdbc_url)
conn = jaydebeapi.connect(driver, jdbc_url, [user, pwd], jar_file)
curs = conn.cursor()
curs.execute(sql)
rows = curs.fetchall()
for row in rows:
db_name = row[0]
# 过滤掉系统库
if db_name == "information_schema" or db_name == "mysql" or db_name == "performance_schema" or db_name == "sys":
continue
out_instance['source_name'] = str(instance['instance_name']) + "-" + str(db_name)
out_instance['source_type'] = 4
out_instance['jdbc_url'] = jdbc_url + "/" + db_name
out_instance['db_name'] = db_name
out_instance['db_user'] = user
out_instance['password'] = pwd
out_instance['charge_user'] = "admin"
out_arr.append(out_instance)
curs.close()
conn.close()
except:
out_instance['source_name'] = str(instance['instance_name']) + "-未连通"
out_instance['source_type'] = 4
out_instance['jdbc_url'] = jdbc_url + "/"
out_instance['db_name'] = "未连通"
out_instance['db_user'] = user
out_instance['password'] = pwd
out_instance['charge_user'] = "admin"
out_arr.append(out_instance)
print(out_arr)
# 输出
# 文件格式: csv
# 0 1 2 3 4 5 6
# 列头: 实例名+dbName source_type(4) jdbc_url db_name db_user password charge_user(admin)
fileheader = ["source_name", "source_type", "jdbc_url", "db_name" ,"db_user","password", "charge_user"]
with open("export.csv", "w") as out_file:
dict_writer = csv.DictWriter(out_file, fileheader)
for out in out_arr:
dict_writer.writerow(out)
out_file.close()