我有两台机器:local_machine,server_machine。我在server_machine上有mysql服务器,在local_machine上有sftp服务器。我正在尝试使用python将sritest.csv
文件(UTF-8)从local_machine发送到server_machine。这些是sritest.csv
的内容:
1,2,3
我在sritest.sql
中保存了sql查询,这些是文件的内容:
LOAD DATA INFILE '{}'
INTO TABLE TESTBED_STAGING.test
COLUMNS TERMINATED BY ','
;
这是我现在的python脚本:
import MySQLdb
import os
import string
# Open database connection
db = MySQLdb.connect (host="1.2.3.4",port=3306,user="app_1",\
passwd="passwd",db="TESTBED_STAGING")
cursor=db.cursor()
#Query under testing
sql = open('sritest.sql','r').read()
print sql
l = os.listdir(".")
for file_name in l:
if file_name.endswith('sritest.csv'):
print 'the csv file we are reading is: '+file_name
#try:
cursor = db.cursor()
print 'filename is '+sql.format(file_name)
cursor.execute(sql.format(file_name))
db.commit()
'''
except Exception:
# Rollback in case there is any error
db.rollback()
print 'ERROR - So, rollback :( :( '
'''
# disconnect from server
db.close()
在上面的脚本中,我评论了try
,except
,因此我可以看到错误发生的地方。目前代码在cursor.execute(sql.format(file_name))
行处突然出现此错误:
OperationalError: (1045, "Access denied for user 'app_1'@'%' (using password: YES)")
我一直在玩,但无法修复它。有什么建议/想法吗?
答案 0 :(得分:1)
对于初学者来说,在每个循环中创建游标并不是一个好主意。您之前已经创建了一个游标,因此可以在for
循环中删除游标声明。
其次,我认为您的错误是由于远程使用用户app_1
在1.2.3.4上无法访问MySQL服务器。在服务器的MySQL控制台上试试这个,
GRANT ALL PRIVILEGES ON TESTBED_STAGING.* TO 'app_1'@'%';
最后,请尽量避免使用print "line"
表示法并开始切换到print("line")
表示法,以便与Python 3.x兼容
答案 1 :(得分:0)
我找到了答案并决定将这个问题留给那些可能面临类似问题的人:
mysql>grant all privileges on *.* to 'app_1'@'%' identified by 'passwd';
LOAD DATA INFILE '{}'
中的sritest.sql
更改为LOAD DATA LOCAL INFILE '{}'
MySQLdb.connect
语句编辑为:
db = MySQLdb.connect (host="1.2.3.4",port=3306,user="app_1",\
passwd="passwd",db="TESTBED_STAGING", local_infile=1)
消除所有错误并传输数据。