2012-08-09 2 views
1

MySQLdb 패키지를 사용하여 Python을 통해 MySQL 테이블을 업데이트하려고합니다.Python MySQLdb 목록 사전 목록에서

I는 사전, 데이터 형식을 갖는 특정 테이블을 업데이트 할 것이다 :

muts={'YES': [rice,bread,pasta] 
     'NO': [sweets,fat,milk,choco]} 

I 필요 해당 열에리스트의 각 항목에 대응 food 값 MySQL의 테이블의 행 (대 위의 사전 값), accept이라는 다른 열이 해당 키로 업데이트됩니다. '예 혹은 아니오'.

나는 하나의 목록을 사용하여 테이블에서 항목을 업데이트하고 싶어 할 때

지금까지, 나는 다음과 같은 을 수행하는 데 사용 :

food=[sweets,fat,milk,choco] 
sql = "UPDATE test2 g SET accept='NO' WHERE g.food IN (%s)" 
to_add = ', '.join(list(map(lambda x: '%s', any_list))) 
sql = sql % to_add 
cursor.execute(sql, any_list) 

하지만 지금이 동시에에서 키 - 값으로 업데이트 할 것을 사전; 나는 길을 잃었다. 당신이 kto_add 배치 있도록

답변

2

의 to_add 라인에 대한 사전을 통해 2%의의의의와 루프를 사용하여 SQL을 정의

>>> muts={'YES': ['rice','bread','pasta'], 
...  'NO': ['sweets', 'fat', 'milk', 'choco']} 
>>> muts 
{'YES': ['rice', 'bread', 'pasta'], 'NO': ['sweets', 'fat', 'milk', 'choco']} 
>>> sql = "UPDATE test2 g SET accept='%s' WHERE g.food IN (%s)" 
>>> for k in muts: 
...  to_add = ', '.join(muts[k]) 
...  ex_sql = sql % (k, to_add) 
...  print ex_sql 
...  # cursor.execute(ex_sql) here 
... 
UPDATE test2 g SET accept='YES' WHERE g.food IN (rice, bread, pasta) 
UPDATE test2 g SET accept='NO' WHERE g.food IN (sweets, fat, milk, choco) 
>>> 

당신은 함수에서 그 넣을 수를 그것을 통과 'any_list' . execute 명령문을 사용하지 않으면 한 줄에 .execute(, any_list)을 사용할 수 없습니다.

, BTW 는 라인이 실제로해야 가입 :

to_add = "'%s'" % "', '".join(muts[k]) 

을 그래서 당신은 각 식품 유형 주위 ' 따옴표로 끝날 것을 : 당신은 또한 사용할 수 있습니다

... # that gives... 
UPDATE test2 g SET accept='YES' WHERE g.food IN ('rice', 'bread', 'pasta') 
UPDATE test2 g SET accept='NO' WHERE g.food IN ('sweets', 'fat', 'milk', 'choco') 

대신 ? 자리 표시 자 구문을 사용하여 SQL 주입 공격을 피하십시오.

+0

놀랍습니다. 당신은 방금 날을 무사히 만들었습니다. 정말 고마워요! – peixe

+0

@peixe :-) 환영합니다. – aneroid