1

这个函数应该连接到数据库,因为我使用了一个异常,当发现不正确的输入时,我会得到我自己创建的消息。但是,当我删除尝试时,我得到:“/'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 文件中找到的信息是:

[客户]

主机='本地主机'

端口 = 3306

用户 = 我的用户名

密码 = “我的密码”

4

2 回答 2

4

你用过:

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
于 2017-12-11T04:52:54.033 回答
3

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

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 方法一样,如果不是这样,它也同样灵活。但是,如果其他非 python 脚本需要引用 my.cnf 文件,那么您必须维护两个单独的 mysql 配置文件。

于 2014-11-29T16:05:14.517 回答