2013-04-08 20 views
0

我有使用字典来存储状态,按键的数量和价值不固定的,比如如何使用准备语句“从xxx选择其中xxx”使用python

dict = {} 
dict['v1'] = 'abc' 
dict['v2'] = 123 
... 
dict['vn'] = xxx 

我的SQL格式是

SELECT * FROM表名,其中V1 = 'ABC' 和v2 = 123 ... VN = XXX

我试图打开这样的SQL第一:

SQL = “从表名,其中V1 =%s和V2 =%s和选择* ... VN =%s” 时

下面的格式可避免SQL注入的问题是,我不知道数值的数量,如何编写这个准备好的陈述。提前致谢。

cursor.execute(SQL,字典[V1],字典[V2],...,字典[V])

回答

0

下面应该工作:

sql = 'select * from tablename where ' + ' and '.join(k + ' = %s' for k in data) 
cursor.execute(sql, tuple(data.values())) 

确保你不进行任何修改的字典创建sql字符串和执行该语句之间,因为如果你做的排序可以改变。

请注意,我将您的字典重命名为data,因此它不会使用dict作为变量名称,因为它会掩盖内置类型。我不完全确定是否需要转换到元组。

+0

它工作,THX,:) – alexqinbj 2013-04-09 01:37:47

+0

提防data.values()排序 - 它可能看起来分类,但没有保证 – petr 2013-04-09 13:53:28

0

我会使用类似以下内容paramerise执行功能:

def print_test(sql, param1, param2, param3, param4, param5): 
    # just output some of the parameters.. 
    print param2, param3 

print_test("whatever", *(i for i in range(5))) 

上面是一个简单的例子来说明在print_test函数中发生了什么。我假设你想要进行某种排序,因此OrderedDict将非常适合你。然后,您可以简单地导出值并且顺序将保持一致。将它们作为元组转换,执行函数将展开它所需的内容。

1

或许矫枉过正,但你可以使用优秀的SqlAlchemy库:

from sqlalchemy.sql import select 
from sqlalchemy import create_engine, MetaData, Table 
engine = create_engine('mysql://your_connection_string') 
meta = MetaData() 
table = Table('table_name', meta, autoload=True, autoload_with=engine) 
s = select([table]) 
for key, val in dict.items(): 
    s = s.where(getattr(table.c, key)==val) 
for row in conn.execute(s): 
    print row 

如果你打算在你的Python做了很多的SQL这可能是值得的。

http://docs.sqlalchemy.org/en/latest/core/tutorial.html

相关问题