如何使用 Python 和 MySQL 连接器检索数据

Posted

技术标签:

【中文标题】如何使用 Python 和 MySQL 连接器检索数据【英文标题】:How to retrieve data using Python and MySQL connector 【发布时间】:2016-04-18 19:55:29 【问题描述】:

我有一个 mysql 数据库,其中包含一个包含服务(google、reddit 等)和密码的表。我想查询 db (SELECT * FROM pwds) 并将它们添加到 Python 字典中,以便字典的键是服务,值是密码。例如,密码['google']='G4sR0*KMVC'。到目前为止,这是我所拥有的:

Passwords =  #Dictionary to store service and password
cnx = mysql.connector.connect(user='Bob', password='foobar', host='127.0.0.1', database='passwords')
query = ("SELECT * FROM pwds")
cursor = cnx.cursor(dictionary=True)
cursor.execute(query)

当我在 iPython 中运行它时,在最后一步之后,我可以看到光标中的内容

如何获取字典中光标中的内容?我一直在尝试不成功,我想不通。

【问题讨论】:

我不想提前假设,但如果这些是您的真实密码(我希望互联网之神不是),您可能应该正确更改它们 也欢迎来到 SO 和 Python 生活的一面。您不会错过 .NET! 当然不是,它们只是为我正在制作的密码管理器随机生成的。我没有在线显示真实密码。 你会惊讶于人们在网上犯的错误。它们看起来像半复杂的密码,通常这些不是示例中的标准。所以只是想在安全方面问。一个好问题,一个友好的提醒是,您有两个具有相同服务的密钥,请记住,这些密钥将在 python dict 中相互替换,因为密钥是唯一的(您可能已经知道这一点,但再次提醒) 嗯...关于密码密钥的要点。我更多地考虑数据库本身,其中两列都是复合主键,而不是字典本身。我会确保该服务将来使用不同的 hmac。 【参考方案1】:
Passwords =  #Dictionary to store service and password
cnx = mysql.connector.connect(user='Bob', password='foobar', host='127.0.0.1', database='passwords')
query = ("SELECT * FROM pwds")
cursor = cnx.cursor(dictionary=True)
cursor.execute(query)

for row in cursor:
    Passwords[row['service']] = row['password']

这可能就是您要找的。 由于这些行实际上是作为来自 mysql 库的 dict 返回的,因此您将像访问任何其他 dict 一样访问单个行“列”。

简而言之,由于字典通过将key 分配给value 来工作,如下所示:

myDict = key : val, key : val

每个密钥都是唯一的,您可以使用密钥中的任何内容访问它们。

myDict = 'name' : 'Torxed', 'type' : 'Funny guy'
myDict['name']

mysql 和上面的字典的唯一区别是mysql 为每一行返回一个字典,但对于每一行的访问方式相同。

mysqlRows = [ 'name' : 'Torxed', 'type' : 'Funny guy', 'name' : 'Amanda', 'type' : 'Has a panda?' ]
for row in mysqlRows:
    print['name']

您想要的是从您的mysql 结果中获取值并将它们存储在您自己的key-slot 中您自己的dictionary 中:

Passwords[key] = val

翻译为:

Passwords[ row['service'] ] = row['password']

【讨论】:

感谢您的深入解决方案!我很欣赏长格式的答案。 @Amanda_Panda 我希望它有一些用处,我主要是在我有空余时间为他们留下深入的答案,以防以后有人偶然发现你的答案(偶尔的 googler 路过)。祝你好运!【参考方案2】:

应该这样做:

passwords = dict([(row["service"], row["password"]) for row in cursor])

或者使用字典理解(在 Python 2.7+ 中可用):

passwords = row["service"]: row["password"] for row in cursor

【讨论】:

以上是关于如何使用 Python 和 MySQL 连接器检索数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ Boost 或 STL 和 Mysql 存储和检索图像

如何使用 executemany 处理异常(MySQL 和 Python)

如何从重复记录中检索mysql表中的最新数据

MySQL使用连接实现多表检索

Python3连接MySQL数据库之mysql-client

设置和验证 Python MySQL 连接中使用的 SSL/TLS 版本