Не могу подключиться к базе данных pymysql с помощью файла.my.cnf

Эта функция должна подключаться к базе данных, потому что я использовал исключение, я получу свое собственное созданное сообщение, когда будет найден неправильный ввод. Но когда я удаляю попытку, за исключением того, что я получаю: "Доступ запрещен для /'user/'@'/'localhost' (используя пароль: НЕТ).

Кажется, что он не читает мой пароль, я понятия не имею, почему небольшая помощь будет оценена. Без этого файла подключение к базе данных работает без ошибок.

    try:
        self.conn = pymysql.connect(read_default_file="~/my.cnf")
        self.curr = self.conn.cursor()

    except pymysql.err.OperationalError : 
        sys.exit("Invalid Input: Wrong username/database or password found, please try again")

Информация, найденная в файле.my.cnf:

[Клиент]

host = 'localhost'

порт = 3306

user = myusername

пароль = "мой пароль"

2 ответа

Ты использовал:

pymysql.connect(read_default_file="~/my.cnf")

Вы должны были использовать:

pymysql.connect(read_default_file='~/.my.cnf',)

Обратите внимание на отсутствующую точку в имени файла. Вы просто загружали другой или несуществующий файл.

~ расширяется, как показано здесь:

https://github.com/PyMySQL/PyMySQL/blob/18b62f6e1d6f65b403c9e8b650f4c3bb27b665e7/pymysql/connections.py

Также я могу подтвердить, что теперь в кавычках или пробелах .my.cnf файл:

echo -e "[client]\nuser=root\npassword=defaultrootpwd" > ~/.my.cnf

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

import pymysql
conn = pymysql.connect(host='localhost',
    port=3306,
    user='myusername',
    passwd='mypasswd')

Если это не сработает, то у вас могут возникнуть другие проблемы (например, ваша база данных может быть настроена на подключение только через сокет для локальных клиентов)

Что касается файла конфигурации, я думаю, что это будет работать, если вы удалите кавычки, например:

[client]
host = localhost
port = 3306
user = myusername
password = mypassword

Я сохранил ваш файл конфигурации как test.cnf и запустил следующий код

# test.cnf    
[client]
host = 'localhost'
port = 3306
user = myusername
password = "mypassword"

$ python3
>>> import configparser
>>> reader = configparser.RawConfigParser()
>>> reader.read('test.cnf')
>>> reader.get('client', 'host')
"'localhost'"
>>> reader.get('client', 'user')
'myusername'

Как видите, синтаксический анализатор конфигурации рассматривает кавычки как часть значения.

Обновление: Обходной путь

ОП упомянул предоставленное решение (т.е. удаление кавычек не решило проблему, с которой он столкнулся). Вот обходной путь, который позволяет отделить свойства конфигурации / соединения от логики программы.

Сохраните конфигурацию в файле Python с именем dbsettings.py.

# dbsettings.py  
connection_properties = {
    'host': 'localhost',
    'port': 3306,
    'user': 'myusername',
    'passwd': 'mypassword'
    }

А затем в вашей основной программе используйте следующие строки для настройки соединения.

try:
    from dbsettings import connection_properties
    self.conn = pymysql.connect(**connection_properties)
    self.curr = self.conn.cursor()
except pymysql.err.OperationalError : 
    sys.exit("Invalid Input: Wrong username/database or password found, please try again")

Если вся ваша программа написана на python, то это позволяет отделить информацию о подключении / конфигурации от логики программы так же, как и при использовании метода my.cnf, и она столь же гибка, если не использовать mroe. Однако, если другие сценарии, отличные от python, должны ссылаться на файл my.cnf, вам придется поддерживать два отдельных файла конфигурации mysql.

Другие вопросы по тегам