PyMySQL 和 OrderedDict

Posted

技术标签:

【中文标题】PyMySQL 和 OrderedDict【英文标题】:PyMySQL and OrderedDict 【发布时间】:2016-02-03 22:46:32 【问题描述】:

我使用 Pymysql 已经有一段时间了,并创建了自己的包装器,我习惯于用它来速记编写查询。尽管如此,我一直在使用 OrderedDict 创建 CSV 文件,因为我需要保持顺序不变,但我意识到如果我使用 PyMySQL 查询数据库,我将无法获得数据库返回的顺序。如果我只想转储东西而不是手写订单,这对于抽查 CSV 文件来说有点烦人。

我的问题是,如何将 PyMySQL 与 OrderedDict 一起使用?目前我的代码如下:

import pymysql
conn = pymysql.connect(host='localhost', user='root', passwd='', db='test')
cursor = conn.cursor(pymysql.cursors.DictCursor)

所以每当我查询时,我都会得到一本字典:

cursor.execute("""SELECT * FROM test""")
for row in cursor:
    pp(row)  # gives me dictionary

我想要的是,当我滚动光标时,我实际上是按照它们从数据库中进入的顺序检索列的 OrderedDict。

类似:

cursor = conn.cursor(pymysql.cursors.OrderedDict)

【问题讨论】:

在查询时添加另一列保存,源行和顺序? @Busturdust - 我可以在我的包装器中写一个函数说“query_ordered”或者在列表中有选择字段的东西,然后可以创建一个生成器来生成ordereddict来代替字典但是如果我可以在不写的情况下得到一个解决方案,而且这也可以很好地与我的包装器配合使用,我宁愿拥有它。 【参考方案1】:

您可以使用cursors.DictCursorMixin 并将其dict_type 更改为collections.OrderedDict(默认为dict):

from collections import OrderedDict
from pymysql.cursors import DictCursorMixin, Cursor

class OrderedDictCursor(DictCursorMixin, Cursor):
    dict_type = OrderedDict

那么你就可以使用如下所示的新游标类了

cursor = conn.cursor(OrderedDictCursor)

【讨论】:

完全按预期工作。刚刚在 PyMySQL 的 github 存储库中也看到了这一点。快速答复!谢谢!

以上是关于PyMySQL 和 OrderedDict的主要内容,如果未能解决你的问题,请参考以下文章

pymysql模块+mysql库/表备份和恢复+事务(锁)

mysqlclient和PyMySQL对比

PyMySQL 和 OrderedDict

pymysql安装和使用

pymysql模块的使用

day37--pymysql和SQLAchemy