2014-01-31 35 views
0

我想直接访问MySql数据库,虽然我使用Django 1.6.1和 我知道使用Django模型更容易,我需要使用游标。 事情是这样的:Python光标动态选择列

columnList = ['Field1', 'Field2'] 
cursor.execute("SELECT %s FROM table", [columnList]) 

但我得到这个异常:(1241, 'Operand should contain 1 column(s)')

如何传递到执行光标功能的DINAMIC列列表?

+0

为什么你需要使用游标呢? –

+0

因为比django查询集更快(http://www.slideshare.net/OReillyOSCON/unbreaking-your-django-application slide 55) – toscanelli

+0

您是否已经知道问题出在哪里?除非您已经为您的应用程序进行了测量,否则无法确定其速度。所以我很好奇现在知道你试过的ORM查询是什么,它并没有根据你的喜好来执行,你希望下拉到执行原始查询。 –

回答

0

最后我建立与列表中的所有元素的字符串,我通过这个字符串的查询字符串:

columnList = ['Field1', 'Field2'] 

for idx, field in enumerate(columnList): 
    if idx != len(columnList)-1: 
     listFields += field + ', ' 
    else: 
     listFields += field 

cursor.execute("SELECT %s FROM table", listFields) 

这不是我一直在寻找,并...我并不以此为荣......但即使这样比迭代django查询集更快

+1

你可以使用:'cursor.execute(“SELECT%s FROM table”,“,”。join(columnList))' – arocks

+0

这很酷,@arocks! Thnks! – toscanelli

2

execute的当前表单中,预期只有一个列表作为第二个参数,但是您正在列表中传递一个列表。试试这个:

columnList = ['Field1', 'Field2'] 
cursor.execute("SELECT %s, %s FROM table", columnList) 
+0

所以我需要知道以前有多少列?我没有这方面的信息......但非常感谢! – toscanelli

+0

理想情况下,是的。 Django需要自动转义每个参数以防止SQL注入攻击。 – arocks