Reputation: 561
I have two machines: local_machine, server_machine. I have mysql server on server_machine and sftp server on local_machine. I am trying to send sritest.csv
file (UTF-8) from local_machine to server_machine using python. These are the contents of sritest.csv
:
1,2,3
I have the sql query saved in sritest.sql
and these are the contents of the file:
LOAD DATA INFILE '{}'
INTO TABLE TESTBED_STAGING.test
COLUMNS TERMINATED BY ','
;
This is the python script I have now:
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()
In the above script, I commented try
,except
so I can see the error where it breaks. Currently the code is breaking at cursor.execute(sql.format(file_name))
line with this error:
OperationalError: (1045, "Access denied for user 'app_1'@'%' (using password: YES)")
I have been playing around but not able to fix it. Any suggestions/ideas?
Upvotes: 1
Views: 1065
Reputation: 561
I figured out the answer and decided to leave this question open for those who might face the similar problem:
mysql>grant all privileges on *.* to 'app_1'@'%' identified by 'passwd';
LOAD DATA INFILE '{}'
in sritest.sql
to LOAD DATA LOCAL INFILE '{}'
MySQLdb.connect
statement as:
db = MySQLdb.connect (host="1.2.3.4",port=3306,user="app_1",\
passwd="passwd",db="TESTBED_STAGING", local_infile=1)
All errors are eliminated and data is transferred.
Upvotes: 0
Reputation: 3262
For starters, creating cursor at every loop is not a good idea. You've already created a cursor earlier, so you can remove the cursor declaration in the for
loop.
Second, I think your error is due to lack of access on MySQL server at 1.2.3.4 remotely using user app_1
. Try this on the server's MySQL console,
GRANT ALL PRIVILEGES ON TESTBED_STAGING.* TO 'app_1'@'%';
Lastly, try and avoid using print "line"
notation and start switching to the print("line")
notation for compatibility with Python 3.x
Upvotes: 1