Скопируйте файл на удаленный сервер и загрузите его в базу данных MySQL - PullRequest
1 голос
/ 12 января 2020

У меня есть файл на компьютере, который постепенно обновляется, и я хочу загрузить его на удаленный сервер и поместить в базу данных MySQL, которая находится на том же сервере. Сервер работает под управлением CENTOS 7, а компьютер работает под управлением Windows. Уже проверил несколько страниц и много поисков в Google и, наконец, получил следующий код:

import base64
import paramiko

import pymysql

from paramiko import SSHClient
from sshtunnel import SSHTunnelForwarder
import pandas as pd


def sendFileFromTo(client, orig, dest):
    sftp = client.open_sftp()
    sftp.put(orig, dest)
    sftp.close()


def exe(client, command):
    stdin, stdout, stderr = client.exec_command(command)
    for line in stdout:
        print('... ' + line.strip('\n'))

    def main():

    client = paramiko.SSHClient()

    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(host, port=port, username='root', password='pass')
    print("Connected")
    #exe(client, 'ls')

    sendFileFromTo(
        client,
        orig,
        dest)

    print("File Sent")

    client.close()

    print("SSH CLOSED")

    with SSHTunnelForwarder(
        (host, port),
        ssh_username='root',
        ssh_password='pass',
        remote_bind_address=('127.0.0.1', 3306),
            local_bind_address=('127.0.0.1', 3305)) as tunnel:

        print("STARTING MYSQL")
        with pymysql.connect(host=tunnel.local_bind_host, user='root',
                             passwd='rootSolar', db='TEST',
                             port=tunnel.local_bind_port, local_infile=True) as conn:

            print("LOADING QUERY")
            #query = '''USE TEST'''
            # print(query)
            #data = pd.read_sql_query(query, conn)
            query = '''LOAD DATA INFILE '/root/copied_file' INTO TABLE RS FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\\n' IGNORE 4 ROWS (@time,record,Radiacion,Radiacion_UVA) SET time = STR_TO_DATE(@time,'%Y-%m-%d %H:%i:%s');'''
            # print(query)
            #data = pd.read_sql_query(query, conn)
            with conn.cursor() as cur:
                cur.executemany(query)
                conn.escape_string()
                conn.commit()


if __name__ == "__main__":
    main()

То, что у меня сейчас есть, создает соединение s sh с удаленным сервером для загрузки и перезаписи файла, закройте и создайте туннель s sh для подключения к MYSQL и базе данных. Переменные хоста и порта имеют значения удаленного сервера для соединения s sh, но, поскольку это публичный c адрес, я не буду приводить эти подробности.

Код хорошо работает с другими MySQL запросы, но именно с этой программой зависает и терминал зависает. Также я не могу использовать Ctrl + c, чтобы закрыть процесс, я должен закрыть терминал, чтобы иметь возможность закрыть его

...