python-mysql cursor.execute失败,访问被拒绝错误

时间:2015-12-23 18:08:32

标签: python mysql

我有两台机器: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()

在上面的脚本中,我评论了tryexcept,因此我可以看到错误发生的地方。目前代码在cursor.execute(sql.format(file_name))行处突然出现此错误:

OperationalError: (1045, "Access denied for user 'app_1'@'%' (using password: YES)")

我一直在玩,但无法修复它。有什么建议/想法吗?

2 个答案:

答案 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)

我找到了答案并决定将这个问题留给那些可能面临类似问题的人:

  1. 在MySQL服务器(server_machine)中,确保在启动mysql后执行此操作: mysql>grant all privileges on *.* to 'app_1'@'%' identified by 'passwd';
  2. LOAD DATA INFILE '{}'中的sritest.sql更改为LOAD DATA LOCAL INFILE '{}'
  3. 在python代码中,将MySQLdb.connect语句编辑为: db = MySQLdb.connect (host="1.2.3.4",port=3306,user="app_1",\ passwd="passwd",db="TESTBED_STAGING", local_infile=1)
  4. 消除所有错误并传输数据。