2015-12-23 2 views
1

У меня есть две машины: local_machine, server_machine. У меня есть сервер mysql на сервере server_machine и sftp на local_machine. Я пытаюсь отправить файл sritest.csv (UTF-8) с local_machine на server_machine с помощью python. Это содержимое sritest.csv: 1,2,3python-mysql cursor.execute failing with access denied error

Я запрос SQL, сохраненные в sritest.sql и они являются содержимое файла:

LOAD DATA INFILE '{}' 
INTO TABLE TESTBED_STAGING.test 
COLUMNS TERMINATED BY ',' 
; 

Это питон скрипт у меня сейчас:

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)") 

Я играл вокруг, но не в состоянии исправить. Любые предложения/идеи?

ответ

1

Во-первых, создание курсора в каждом цикле не является хорошей идеей. Вы уже создали курсор раньше, поэтому вы можете удалить объявление курсора в цикле for.

Во-вторых, я думаю, ваша ошибка связана с отсутствием доступа на сервере MySQL на 1.2.3.4 удаленно с использованием пользователя app_1. Попробуйте это на консоли MySQL сервера,

GRANT ALL PRIVILEGES ON TESTBED_STAGING.* TO 'app_1'@'%'; 

Наконец, попробуйте и избегать использования print "line" обозначений и начать переход к print("line") нотации для совместимости с Python 3.x

+0

Пользователь 'app_1' уже имеет все привилегии на сервере MySQL (я имею в виду, что я уже выполнил указанную выше команду). –

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. В коде питона, редактировать MySQLdb.connect заявление как: db = MySQLdb.connect (host="1.2.3.4",port=3306,user="app_1",\ passwd="passwd",db="TESTBED_STAGING", local_infile=1)

Все ошибки устранены, и данные передаются.