0
点赞
收藏
分享

微信扫一扫

python扫描mysql库列表,并生成jdbc连接

小猪肥 2022-03-11 阅读 53

背景说明

  接到业务方需求,需要扫描一批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()
举报

相关推荐

0 条评论