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, но я понятия не имею, как ее решить.
Ответы
Ответ 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
Я встретил тот же вопрос, и мое решение заключается в следующем:
- Запустите
ssh -fN -L 3307:mysql_host:3306 [email protected]_host
в моем терминале.
- Затем введите свой пароль SSH
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")