Подтвердить что ты не робот

PyMySQL не может подключаться к MySQL на localhost

Я пытаюсь подключиться к MySQL на localhost с помощью PyMySQL:

import pymysql
conn = pymysql.connect(db='base', user='root', passwd='pwd', host='localhost')

но (как на Python 2.7, так и на Python 3.2) Я получаю ошибку:

socket.error: [Errno 111] Соединение отклонено

pymysql.err.OperationalError: (2003, "Не удается подключиться к серверу MySQL на" localhost "(111)" )

Я уверен, что mysqld запущен, потому что я могу подключиться с помощью команды mysql или phpMyAdmin. Более того, я могу подключиться с помощью MySQLdb на Python 2 с почти тем же кодом:

import MySQLdb
conn = MySQLdb.connect(db='base', user='root', passwd='pwd', host='localhost')

Похоже, что проблема заключается в стороне PyMySQL, а не в MySQL, но я понятия не имею, как ее решить.

4b9b3361

Ответ 1

Два догадки:

  • Запустите mysqladmin variables | grep socket, чтобы узнать, где находится сокет, и попробуйте настроить соединение следующим образом:

    pymysql.connect(db='base', user='root', passwd='pwd', unix_socket="/tmp/mysql.sock")
    
  • Запустите mysqladmin variables | grep port и убедитесь, что порт 3306. Если нет, вы можете вручную установить порт:

    pymysql.connect(db='base', user='root', passwd='pwd', host='localhost', port=XXXX)
    

Ответ 2

Похоже, что изменение localhost на 127.0.0.1 исправляет ошибку, по крайней мере, в моей конфигурации. Если этого не произойдет, я буду искать ошибки в tcp sockets connection и, конечно же, публиковать их как ошибку в pymysql.

Ответ 3

Я решил проблему, заменив localhost на 127.0.0.1 и изменив пароль на мой пароль базы данных MYSQL, как показано ниже:

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    passwd = 'XXXXXXXXX',
    db = 'mysql'
)

Ответ 4

Я встретил тот же вопрос, и мое решение заключается в следующем:

  1. Запустите ssh -fN -L 3307:mysql_host:3306 [email protected]_host в моем терминале.
  2. Затем введите свой пароль SSH
  3. conn = pymysql.connect(db='base', user='root', passwd='pwd', host='localhost')

Эта ошибка возникает из-за того, что база данных не поддерживает ссылку напрямую.

Ответ 5

Я спросил, почему работает сокет, но не TCP, и я ответил, что bind-address в /etc/my.cnf был установлен неправильно. Это тоже может быть вашей проблемой, так как методы сокетов работают просто отлично, а TCP - нет.

Ответ 6

Вам также нужно добавить порт к соединению. Попробуйте это, и он отлично работает.

pymysql(Module Name).connect(host="localhost", user="root", passwd="root", port=8889, db="db_name")