У меня есть файл на компьютере, который постепенно обновляется, и я хочу загрузить его на удаленный сервер и поместить в базу данных 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, чтобы закрыть процесс, я должен закрыть терминал, чтобы иметь возможность закрыть его