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 ответов

Решение

Две догадки:

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

    pymysql.connect(db='base', user='root', passwd='pwd', unix_socket="/tmp/mysql.sock")
    
  2. Бежать 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'
)

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

  1. запустите "ssh -fN -L 3307:mysql_host:3306 ssh_user@ssh_host" в моем терминале.
  2. затем введите ваш пароль SSH
  3. 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';
Другие вопросы по тегам