【python小脚本】从数据库获取服务器文件路径通过scp下载本地

举报
山河已无恙 发表于 2021/12/15 18:59:49 2021/12/15
【摘要】 何谓喜欢一个人,遇上她之前不知情为何物,错过之后,便更不知了 ——烽火戏诸侯《雪中悍刀行》

写在前面

我的需求

需要在mysql数据库中查到相关文件的在服务器的路径,然后通过scp来下载相关文件,之前是手动操作,我现在要写成一个脚本

我需要解决的问题

  • 如何使用python连接mysql数据库
  • 如何使用python执行scp命令.

我是怎么做的

  • 使用 pymysql模块连接mysql获取路径
  • 使用 paramiko模块执行scp命令

何谓喜欢一个人,遇上她之前不知情为何物,错过之后,便更不知了 ——烽火戏诸侯《雪中悍刀行》


编写脚本的准备

pymysql

pymysql是一个基于python的 MySQL 客户端库,官网:https://pymysql.readthedocs.io/en/latest/user/examples.html下面是一个简单的Demo

import pymysql.cursors

# Connect to the database
connection = pymysql.connect(host='localhost',
                             user='user',
                             password='passwd',
                             database='db',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

with connection:
    with connection.cursor() as cursor:
        # Create a new record
        sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
        cursor.execute(sql, ('webmaster@python.org', 'very-secret'))

    # connection is not autocommit by default. So you must commit to save
    # your changes.
    connection.commit()

    with connection.cursor() as cursor:
        # Read a single record
        sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
        cursor.execute(sql, ('webmaster@python.org',))
        result = cursor.fetchone()
        print(result)

Paramiko

Paramiko是 SSH协议的纯 Python实现 ,提供客户端和服务器功能。它为高级 SSH 库Fabric提供了基础,可以运行远程 shell 命令或传输文件。官网:https://www.paramiko.org/,下面是一个简单的Demo

import paramiko

# Connect
client = paramiko.SSHClient()
client.connect(host, port, username)
# Obtain session
session = client.get_transport().open_session()
# Forward local agent
AgentRequestHandler(session)
# Commands executed after this point will see the forwarded agent on
# the remote end.
session.exec_command("git clone https://my.git.repository/")

实现

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   apps.py
@Time    :   2021/12/14 16:34:56
@Author  :   Li Ruilong
@Version :   1.0
@Contact :   1224965096@qq.com
@Desc    :    一个从mysql数据库获取文件路径,通过scp远程下载文件到本地的脚本

pip install pymysql
pip install paramiko              
'''

# here put the import lib

import pymysql
import os
import time
import paramiko


# mysql数据库相关配置
host = '127.0.0.1'
port = 3306
user = 'user'
password = '***********'
db = 'dbname'

# ssh相关配置
ssh_hostname = "127.0.0.1"
ssh_username = "user"
ssh_password = '***********'


def initDB():
    '''连接数据库的操作
    Args:
        host(str)
        port(int) 
        user(str)
        password(str)
        db(str)
    Returns:
        连接状态:1成功,0失败
    '''
    try:
        global connection
        connection = pymysql.connect(host=host, port=port, user=user, password=password,
                                     db=db, charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
        global cursor
        cursor = connection.cursor()
        print("数据库连接成功============================================", time.strftime(
            "%Y-%m-%d %H:%M:%S", time.localtime()), "=========================", '\n')
        return 1
    except:
        print("数据库连接异常============================================", time.strftime(
            "%Y-%m-%d %H:%M:%S", time.localtime()), "=========================", '\n')
        return 0


def scp(local_filename, remote_path):
    '''创建`scp`连接,
    Args:
        local_filename(str): 本地要存放的文件位置
        remote_path(int) 远程的文件位置
    Returns:
        void
    '''
    # 创建ssh访问
    ssh = paramiko.SSHClient()
    ssh.load_system_host_keys()
    ssh.set_missing_host_key_policy(
        paramiko.AutoAddPolicy())  # 允许连接不在know_hosts文件中的主机
    ssh.connect(ssh_hostname, port=22, username=ssh_username,
                password=ssh_password)  # 远程访问的服务器信息

    # 创建scp,下载文件
    sftp = paramiko.SFTPClient.from_transport(ssh.get_transport())
    sftp = ssh.open_sftp()
    sftp.get(remote_path, local_filename)


def execute():
    sql = '''SELECT  a.number,a.path,a.date FROM   tablename a 
             WHERE (number LIKE "%{}" OR numbers LIKE "%{}" ) 
             AND year(a.date) ="{}"  
             AND month(a.date) = "{}" '''

    print("查询sql:",sql)

    year = input("请输入年份:")
    month = input("请输入月份:")
    number = input("请输入电话号码:")
    print("\n")
    
    sql = sql.format(number,
                     number,
                     year,
                     month)
    print("数据查询中请稍等.....")
    resout = cursor.execute(sql)
    if(resout == 0):
        print("没有需要的数据!!!", '\n')
        time.sleep(5)
    else:
        date = cursor.fetchall()
        for i in date:
            pathName = i["path"]
            print("获取到的文件位置:", pathName, '\n') #/bakrecord/record/2020/05/25/800142/800142_202918189.mp3 
            # 获取文件名称
            fileName = str(pathName).split("/")[7]
            print("文件名称:", fileName, '\n')
            # 当前工作环境目录
            currentPath = os.getcwd()
            loadPathName = currentPath+"\\"+fileName
            try:
                scp(loadPathName, pathName)
                print("下载成功============================================", time.strftime(
            "%Y-%m-%d %H:%M:%S", time.localtime()), "=========================", '\n')
                print("下载后的文件路径:", loadPathName, '\n')
            except:
                print("下载异常!!!!", '\n')
                time.sleep(5)


if __name__ == '__main__':
    print('数据库连接','\n')
    if (initDB() == 1):
        while True:
            boo = input("是否下载录音文件:?y/n\n")
            if boo == 'y':
                execute()
            else:
              break    
    else:
        print("数据库链接异常")

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。