按列表属性筛选时SQLAlchemy属性错误

时间:2013-04-24 16:39:25

标签: sqlalchemy

在搜索并尝试不同的事情后,我似乎无法弄清楚我在这里做错了什么。我打算发生的事情是使用一个Services对象填充orderServicesFull,该对象填充了由orderServices的serviceID过滤的数据库数据。

我遇到的问题是我似乎找不到从orderServices(第二行代码)中提取serviceID的每个实例的正确语法。

orderServices = DBSession.query(ServicesByOrder).filter(ServicesByOrder.orderID == request.GET['orderID']).all()

orderServicesFull = DBSession.query(Services).filter(Services.serviceID == orderServices.serviceID).all()

错误:

AttributeError: 'list' object has no attribute 'serviceID'

我尝试了什么:

在我试图解决这个问题时,我首先做了一些打印,以了解传递的内容。我还查看了一些文档,试着理解什么是合适的。我甚至试过这个......大笑

print("<---DEBUG--->")
    serviceIDs = []
    for i in range(0, len(orderServices)):
        serviceIDs.append(orderServices[i].serviceID)
        print(serviceIDs[i])

这背后的想法是它是一个简单的列表,我可以更轻松地使用它。我试图使用它而不是orderServices列表。正如你猜测的那样也不起作用。

非常感谢任何想法或建议。

感谢您的时间

!解决!

经过多次搞乱和更多的研究后,我想出了一个解决方案。它可能没有其他人想象的那么高效,但它有效。

我的问题来自于我不知道列表中充满了对象。

orderServiceList = DBSession.execute(\
"SELECT s.serviceID, s.serviceName, s.serviceCost "+\
"FROM tblServicesByOrder AS so "+\
"INNER JOIN tblServices AS s "+\
"ON so.serviceID = s.serviceID "+\
"WHERE so.orderID = 1").fetchall()

orderServicesFull = [row for row in orderServiceList]

这样做允许我创建一个包含我需要的数据的字典列表,然后从那里填写我的orderServicesFull。

我希望这有助于其他人遇到同样的问题或类似问题。

1 个答案:

答案 0 :(得分:1)

从您的第一个代码段开始,orderServices变量实际上是一个列表。因此,您无法在第二个查询中使用orderServices.ID(您得到的错误解释了这一点) 您应该能够使用ORM

join查询获取所有服务
orderServicesFull = (DBSession.query(Services)
    .join(ServicesByOrder, Services.serviceID == ServicesByOrder.serviceID)
    .filter(ServicesByOrder.orderID == request.GET['orderID'])
    ).all()

如果您在ServicesServicesByOrder之间定义了(仅一个)关系,则该联接不需要clause参数,并且变为.join(ServicesByOrder) < / em>的