首页 > 解决方案 > 使用 pymysql 不会从本地磁盘更新数据库

问题描述

我有一个场景,我使用 python 脚本(downloadsftp.py)将几个 .csv 文件从 sftp 服务器下载到我的本地 linux 服务器,一旦下载文件,我重命名这些 csv 文件并触发(updatedb.py),这整个事情cron 作业已设置。

我看到的是我从 SFTP 服务器下载的文件已更新,但是当 cron 作业在指定时间自动运行时,它不会将更新的文件推送到数据库,而是将旧文件或以前的文件推送到数据库。对于通过另一个 cron 作业实现的所有下载文件,文件权限为 chmod 777。

这是我的脚本:

下载sftp.py

filelist = server.listdir()
for filename in filelist:
    filedate = re.search(".*\.csv$", filename)
    if filedate:
        print (filename)
        server.get("/sftpfolder/" + filename, "/opt/currentdata/" + filename)
        print("latest files downloaded to /opt/currentdata now proceeeding with creating backup")
        server.get("/sftpfolder/" + filename, "/opt/backupdata/" + filename)
        print("backup files created in /opt/backupdata")
        server.remove("/sftpfolder/" + filename)
        print ("cleaning files from FTP server")

print ("SFTP process completed closing FTP connection")
server.close()

print ("Bye Bye SFTP")

print ("Renaming files for updating database")
print(" ")

dir= "/opt/currentdata"

for newname in os.listdir(dir):
         if(newname.split('.')[0]=='CAS1' and "J" in newname):
                print newname,'BASD.csv'
                shutil.move(newname, "BASD.csv")

for newname in os.listdir(dir):
         if(newname.split('.')[0]=='LST' and "N" in newname):
                print newname,'CVGH.csv'
                shutil.move(newname, "CVGH.csv")

数据库更新.py

def csv_to_mysql(load_sql, host, user, password):
    '''
    This function load a csv file to MySQL table according to
    the load_sql statement.
    '''
    try:
        con = pymysql.connect(host=host,
                                user=user,
                                password=password,
                                autocommit=True,
                                local_infile=1)
        print('Connected to DB: {}'.format(host))
        # Create cursor and execute Load SQL
        cursor = con.cursor()
        cursor.execute("truncate table mdb.data1;")
        cursor.execute("truncate table mdb.data2;")
        print("truncated old values from database...updating current values")
        cursor.execute(load_sql)
        cursor.execute(load_sql1)
        print('Succuessfully updated the table from currentdata dir')
        con.close()

    except Exception as e:
        print('Error: {}'.format(str(e)))
        sys.exit(1)

# Execution Example
load_sql = """ LOAD DATA LOCAL INFILE '/opt/currentdata/BASD.csv' INTO TABLE mdb.data1\
 FIELDS TERMINATED BY ';' ENCLOSED BY '"' IGNORE 1 LINES; """

load_sql1 = """ LOAD DATA LOCAL INFILE '/opt/currentdata/CVGH.csv' INTO TABLE mdb.data2\
 FIELDS TERMINATED BY ';' ENCLOSED BY '"' IGNORE 1 LINES; """

host = 'xxx'
user = 'dd'
password = 'ww'

csv_to_mysql(load_sql, host, user, password)

Cron 工作:

30 21 * * * cd /opt/currentdata/ && python /opt/currentdata/downloadsftp.py >> /opt/scriptlogs/sftp.log 2>&1
33 21 * * * cd /opt/currentdata/ && python /opt/currentdata/dbupdate.py >> /opt/scriptlogs/db1all.log 2>&1

我不知道为什么更新的文件没有推送到数据库中,但是旧文件可以在这里帮助了解 cron 或下载和移动服务器中的文件是否有问题,因为当我手动运行 dbupdate.py 脚本时它正确更新的目录。

标签: pythonlinuxbashpython-2.x

解决方案


推荐阅读