Не могу подключиться к базе данных 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',)
Обратите внимание на отсутствующую точку в имени файла. Вы просто загружали другой или несуществующий файл.
~
расширяется, как показано здесь:
Также я могу подтвердить, что теперь в кавычках или пробелах .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.