【问题标题】:SELECT results with wrong column order with PyMySQL使用 PyMySQL 选择列顺序错误的结果
【发布时间】:2015-12-06 20:29:22
【问题描述】:

我正在通过 python 对 MySQL 数据库执行 SQL“SELECT”查询,使用 PyMySQL 作为接口。以下是执行任务的代码摘录:

try:
        with self.connection.cursor() as cursor:
            sql = "SELECT `symbol`,`clordid`,`side`,`status` FROM " + tablename + " WHERE `tradedate` >= %s AND (`status` =%s OR `status`=%s)"
            cursor.execute(sql,(str(begindate.date()),'I','T'))
            a = cursor.fetchall()

查询执行得很好。问题是结果的列顺序与查询中指定的顺序不匹配。如果我运行添加以下代码:

for b in a:
            print b.values()

变量“b”中的值按以下顺序出现:

'status', 'symbol', 'side', 'clordid'

此外,我指定的顺序无关紧要 - 结果始终按此顺序显示。有没有什么办法解决这一问题?提前致谢!

【问题讨论】:

  • 这个特定查询的结果的行顺序与我无关。然而,列排序至关重要,因为我猜将来我将执行的任何 SELECT 查询都会出现这种情况。
  • 当您致电print b[0], b[1] 等时会发生什么?我认为.values() 只是在内部返回值列表,忽略顺序。
  • 试试这个解决方案:stackoverflow.com/a/10195344/4421474
  • @LawrenceBenson,b 中的索引与 .values() 返回的值的顺序一致
  • @Alex,这行得通!非常感谢!我最终使用了这个确切的解决方案。我只是认为会有更多(我想说'pythonic',但我想我在语言中的n00bness并不让我值得使用这样的形容词)综合和一般的方式来做这件事,

标签: mysql python


【解决方案1】:

在测试中,我发现所选答案(将 dict 转换为 OrderedDict)在保留查询结果列顺序方面不可靠。

@vaultah's answer in a similar question 建议使用pymysql.cursors.DictCursorMixin

class OrderedDictCursor(DictCursorMixin, Cursor):
    dict_type = OrderedDict

...创建一个能记住正确列顺序的游标:

cursor = conn.cursor(OrderedDictCursor)

然后像平常一样得到你的结果:

results = cursor.fetchall()
for row in results:
    print row # properly ordered columns

我更喜欢这种方法,因为它稳定,需要的代码更少,并且可以在适当的级别处理排序(在读取列时)。

【讨论】:

    【解决方案2】:

    我很确定您需要collections.OrderedDict,因为每个表行都是一个字典,其中键用于列:

    # python 2.7
    import pymysql.cursors
    from collections import OrderedDict
    
    # ...
    results = cursor.fetchall()
    
    for i in results:
        print OrderedDict(sorted(i.items(), key=lambda t: t[0]))
    

    另外,根据您的代码 sn-p b.values() 听起来像 SQL ORDER BY col_name ASC|DESC。在这种情况下,SQL 应该可以很好地工作。

    【讨论】:

    • @BernardoAmorim 是通过OrderedDict还是SQL语句解决的?
    • 使用 OrderedDict!
    【解决方案3】:

    既然你喜欢that solutuion

    这是一种方法:

     with self.connection.cursor() as cursor:
            sql = "SELECT `symbol`,`clordid`,`side`,`status` FROM " + tablename + " WHERE `tradedate` >= %s AND (`status` =%s OR `status`=%s)"
            cursor.execute(sql,(str(begindate.date()),'I','T'))
            a = cursor.fetchall()
     for b in a:
             print "%s, %s, %s, %s" % (b["symbol"], b["clordid"], b["side"], b["status"])
    

    我不确定是否应该发布此答案或将您的 OP 标记为重复关闭。

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多