返回集合时元组索引超出范围 Class
Tuple index out of range while returning a Collection Class
我正在使用 Python 和 MySqlDB 开发一个 Google App Engine 项目,App Engine 要求我 return 一个 Message 对象到端点。
这是 returning class 的样子:
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 列。
以下是归来的合集Class
class ReturningClassCollection(messages.Message):
"""Collection of ReturningClass objects."""
items = messages.MessageField(ReturningClass, 1, repeated=True)
这是主要的 Class,它实际上完成了所有 returning:
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 语句提供硬编码到 returning 游标中的 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(
??
))
到 return 只有 select 语句中的列?
你的问题不是很清楚。显然你不能传递你没有从数据库中获取的列。
如果您实际上是在询问如何将 select 的任何列动态传递到消息 class 中,您可以使用字典游标并将该字典传递到消息实例化中:
from MySQL import cursors
...
cursor = db.cursor(cursors.DictCursor)
...
for result in cursor.fetchall():
returning_obj = ReturningClass(**result)
returning_array.append(returning_obj)
我正在使用 Python 和 MySqlDB 开发一个 Google App Engine 项目,App Engine 要求我 return 一个 Message 对象到端点。
这是 returning class 的样子:
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 列。
以下是归来的合集Class
class ReturningClassCollection(messages.Message):
"""Collection of ReturningClass objects."""
items = messages.MessageField(ReturningClass, 1, repeated=True)
这是主要的 Class,它实际上完成了所有 returning:
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 语句提供硬编码到 returning 游标中的 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(
??
))
到 return 只有 select 语句中的列?
你的问题不是很清楚。显然你不能传递你没有从数据库中获取的列。
如果您实际上是在询问如何将 select 的任何列动态传递到消息 class 中,您可以使用字典游标并将该字典传递到消息实例化中:
from MySQL import cursors
...
cursor = db.cursor(cursors.DictCursor)
...
for result in cursor.fetchall():
returning_obj = ReturningClass(**result)
returning_array.append(returning_obj)