无法使用.my.cnf文件连接到数据库pymysql

时间:2014-11-29 15:33:17

标签: sql database python-3.x my.cnf pymysql

此函数应连接到数据库,因为我使用了异常,当找到错误的输入时,我将获得自己创建的消息。但当我删除try时,除了我得到:“Acces拒绝/'user /'@'/'localhost'(使用密码:NO)。

它似乎没有读取我的密码我不知道为什么会得到一些帮助。没有这个文件连接到数据库工作正常没有任何错误。

    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'

port = 3306

user = myusername

password =“mypassword”

2 个答案:

答案 0 :(得分:1)

您使用过:

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

您应该使用:

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

请注意文件名中缺少的点。您只是加载了一个不同的或不存在的文件。

正在展开~,如下所示:

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

此外,我可以确认.my.cnf文件中现在需要引号或空格:

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

答案 1 :(得分:0)

首先,您可以使用以下命令连接到数据库。

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'

如您所见,配置解析器将引号视为值的一部分。

更新:解决方法

OP提到了所提供的解决方案(即删除引号并未解决他所面临的问题)。这是一种解决方法,可以实现配置/连接属性与程序逻辑的分离。

将配置保存在名为dbsettings.py。

的python文件中
# 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配置文件。