【问题标题】:Tuple index out of range while returning a Collection Class返回集合类时元组索引超出范围
【发布时间】:2015-03-16 08:37:23
【问题描述】:

我正在使用 Python 和 MySqlDB 处理 Google App Engine 项目,App Engine 要求我将 Message 对象返回到端点。
这是返回类的外观:

class ReturningClass(messages.Message):
    """Return Column values stored here."""
    ID = messages.IntegerField(1)
    Locality_Name = messages.StringField(2)
    Pincode = messages.IntegerField(3)
    No_of_LL = messages.IntegerField(4)
    No_of_Hospitals = messages.IntegerField(5)
    No_of_Hotels = messages.IntegerField(6)

    And So on...

我想动态获取大约 30 列。

下面是 ReturningClass 的集合

class ReturningClassCollection(messages.Message):
    """Collection of ReturningClass objects."""
    items = messages.MessageField(ReturningClass, 1, repeated=True)

这是实际执行所有返回的主类:

class MainClass(webapp2.RequestHandler):
    def get(self,Columns):
        if (os.getenv('SERVER_SOFTWARE') and
            os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/')):
            db = MySQLdb.connect(unix_socket='/cloudsql/' + _INSTANCE_NAME, db='DatabaseName', user='root')
        else:
            db = MySQLdb.connect(host='127.0.0.1', port=3306, db='DatabaseName', user='root')
        cursor = db.cursor()

        ReturningArray=ReturningClassCollection()

        query="SELECT %s FROM DemoTable"%(Columns)
        cursor.execute(query)

        for result in cursor.fetchall():
            ReturningArray.items.append(ReturningClass(
            ID = result[0] ,
            Locality_Name = cgi.escape(result[1]),
            Pincode = result[2],
            No_of_LL= result[3],
            No_of_Hospitals = result[4] 
            ))
        cursor.close()
        db.close()
        return ReturningArray

如果我给 select 语句提供 5 个硬编码到返回游标中的预期列值,这将有效。
例如:

query="SELECT ID,Locality_Name,Pincode,No_of_LL,No_of_Hospitals,No_of_Hotels 
FROM DemoTable"

但如果我这样做:

query="SELECT ID,Locality_Name  
FROM DemoTable"

我得到一个:

IndexError: tuple index out of range

如何获得

for result in cursor.fetchall():
     ReturningArray.items.append(ReturningClass(
     ??
     ))

只返回 select 语句中的列?

【问题讨论】:

    标签: python mysql-python google-app-engine-python


    【解决方案1】:

    你的问题不是很清楚。显然你不能传递你没有从数据库中获得的列。

    如果您实际上是在询问如何将您选择的任何列动态传递到消息类中,您可以使用字典光标并将该字典传递到消息实例化中:

    from MySQL import cursors
    ...
    cursor = db.cursor(cursors.DictCursor)
    ...
    for result in cursor.fetchall():
        returning_obj = ReturningClass(**result)
        returning_array.append(returning_obj)
    

    【讨论】:

    • 是的!我正是这个意思!我在询问如何将选择查询中的任何列动态传递给消息类。我是 python 新手,我不知道如何正确地提出问题。对此很抱歉,但你能解释一下我应该如何处理字典游标吗?有些列返回字符串,而大多数其他列返回整数。而我现在正在做的是将类中的变量准确地映射到列。如何使用字典替换所有这些?
    • 嗯,这就是我在上面展示的 - 这就是 (**result) 所做的。并且它们是字符串还是整数应该没有任何区别,只要 db 中的列类型与消息 protobuff 中的字段类型相同。
    • 好吧,我碰壁了:S 你能再举一个将字典传递给班级的例子吗?我应该在类的构造函数参数中有一个字典值吗?现在我在尝试这个时遇到类型错误:returning_obj = ReturningClass(**result) TypeError: _MessageClass object argument after ** must be a mapping, not tuple
    • 你能推荐一个好的链接来阅读这个吗?我仍然不完全明白发生了什么。而且我在谷歌上找不到很多关于 DictCursors 的信息。但是感谢您解决这个问题! :D
    • 查找“字典解包”。有各种 SO 问题和解释它的文章。
    猜你喜欢
    • 2019-06-20
    • 1970-01-01
    • 2013-07-28
    • 2021-03-02
    • 2018-11-16
    • 2016-04-04
    • 2020-06-08
    • 2017-07-12
    相关资源
    最近更新 更多