你有分裂後的列表,你可以片,列出得到一個子列表:
for prod_emp in prodemployees:
prod_emp = prod_emp.split()
prod, emp = prod_emp[0], prod_emp[1:]
這裏prod
設爲您的分割字符串的第一個元素,emp
到列表除了第一個元素:
>>> prodemployees = ['prd1 employe4 employe2', ' prd2 employe2']
>>> for prod_emp in prodemployees:
... prod_emp = prod_emp.split()
... prod, emp = prod_emp[0], prod_emp[1:]
... print prod, emp
...
prd1 ['employe4', 'employe2']
prd2 ['employe2']
從這裏開始,我會使用SQL參數來執行實際查詢。構建過濾器,然後通過在各分割參數的鏈作爲一個長參數列表:
from itertools import chain
filters = filters = ('(product=%s AND employee in ({}))'.format(', '.join('%s' for _ in range(len(pe.split()) - 1))) for pe in prodemployees)
cursor.execute('SELECT * FROM sometable WHERE {}'.format(
' OR '.join(filters)),
chain.from_iterable(pe.split() for pe in prodemployees))
這裏filters
生成帶有參數佔位符合適的SQL:
>>> filters = ('(product=%s AND employee in ({}))'.format(', '.join('%s' for _ in range(len(pe.split()) - 1))) for pe in prodemployees)
>>> list(filters)
['(product=%s AND employee in (%s, %s))', '(product=%s AND employee in (%s))']
>>> filters = ('(product=%s AND employee in ({}))'.format(', '.join('%s' for _ in range(len(pe.split()) - 1))) for pe in prodemployees)
>>> 'SELECT * FROM sometable WHERE {}'.format(
... ' OR '.join(filters))
'SELECT * FROM sometable WHERE (product=%s AND employee in (%s, %s)) OR (product=%s AND employee in (%s))'
這.execute()
將填補到從查詢該chain.from_iterable()
提供的參數:
>>> list(chain.from_iterable(pe.split() for pe in prodemployees))
['prd1', 'employe4', 'employe2', 'prd2', 'employe2']
的%s
佔位符用她e特定於某些類型的數據庫適配器;其他人可以用?
代替;檢查數據庫適配器文檔。
是'prd2 employe2'故意開始的空間嗎? – Don
不要在'range()'中使用'for i,列表上的直接循環會執行。 –
noo的空間不是故意的 – salamey