PyMySQL не может подключиться к MySQL на локальном хосте
Я пытаюсь подключиться к MySQL на локальном хосте, используя 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, но я не знаю, как ее решить.
11 ответов
Две догадки:
Бежать
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)
Похоже на изменение localhost
в 127.0.0.1
исправляет ошибку, по крайней мере, в моей конфигурации. Если это не так, я бы искал ошибки в tcp sockets connection
и, конечно же, опубликовать его как ошибку в pymysql
bugtrack.
Я решил проблему, заменив localhost
с 127.0.0.1
и изменение пароля на мой пароль базы данных MYSQL, как показано ниже;
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
passwd = 'XXXXXXXXX',
db = 'mysql'
)
Я встретил тот же вопрос, и мое решение заключается в следующем.
- запустите "ssh -fN -L 3307:mysql_host:3306 ssh_user@ssh_host" в моем терминале.
- затем введите ваш пароль SSH
- conn = pymysql.connect(db='base', user='root', passwd='pwd', host='localhost') причина возникновения этой ошибки заключается в том, что база данных не поддерживает ссылку напрямую.
Я спросил, почему работает сокет, но не TCP, и я ответил, чтоbind-address
в /etc/my.cnf
был установлен неправильно. Это может быть и вашей проблемой, поскольку методы сокета работают нормально, а TCP - нет.
Тем, кто изо всех сил пытается подключить localhost MySQL из dockerized flask-sqlalchemy или с помощью pymysql, пожалуйста, посмотрите этот поток, очень полезно Как подключить локально размещенную базу данных MySQL с контейнером докеров
Если вы используете Docker, вам может понадобиться использовать
host.docker.internal
вместо
localhost
.
У меня была такая же проблема на AWS - и оказалось, что моя группа безопасности блокировала соединение. Я временно открыл все связи и вуаля! Это связано!
Есть ли у вас какое-либо микропрограммное обеспечение или микропрограммное обеспечение на основе хоста, которое может блокировать соединение? Я думал, что это мой код и все в порядке. Также проверьте порт, к которому вы подключаетесь.
Мне удалось решить мою проблему, используя порт без какой-либо цитаты, например:
port = 3306,
Вам также необходимо добавить порт к соединению. Попробуйте это, и это отлично работает.
pymysql(Module Name).connect(host="localhost", user="root", passwd="root", port=8889, db="db_name")
Это сработало для меня:
import pymysql
db = pymysql.connect(host="localhost",port=8889,user="root",passwd="root")
cursor=db.cursor()
cursor.execute("SHOW DATABASES")
results=cursor.fetchall()
for result in results:
print (result)
если вы хотите найти порт #, перейдите к mysql в терминале и введите:
SHOW VARIABLES WHERE Variable_name = 'hostname';
SHOW VARIABLES WHERE Variable_name = 'port';