python - 使用 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 脚本时它正确更新的目录。
解决方案
推荐阅读
- php - php正确的json清单
- jenkins - 如何在声明性管道中获取和格式化 git changelog
- database - 使用自动创建的用户运行 dockerized Oracle 数据库
- c# - 检测串口是否断开C#
- java - Java Swagger 不生成端点响应类型为 List 的服务
- php - Gmail 在邮件详细信息中显示已永久移动
- asynchronous - 如何将向量作为异步流处理?
- html - 为什么我的按钮即使留有余量也不会移动?
- unity3d - 无法从 Unity Hub 安装任何 Unity 版本
- mongodb - 创建 ssh 密钥后,ubuntu vps 上的 MongoDB / Mongod 出现“连接被拒绝”错误