2010-01-08 6 views
1
'getIndexMySQLQuery'쿼리가이 구문과 잘 작동하지만 다른 하나는 'updateIndexMySQLQuery'가 작동하지 않습니다. 어떤 힌트 나 제안을 어떻게 수정합니까? 모든 의견과 제안은 높이 평가됩니다.

답변

2

쿼리 문자열 내에 세 개의 자리 표시자를 사용하고 보간을 위해 하나의 변수 만 제공하므로 두 번째 방법이 작동하지 않습니다.

updateIndexMySQLQuery = """UPDATE %s 
SET numberID=%%s WHERE numberID=%%s;""" % (tableName,) 

문자열 서식 메커니즘이 퍼센트 기호는 당신이, 3 개 값을 제공 할 것으로 기대하지 않습니다이 방법 (답의 첫 번째 버전을 나에게 수치) "탈출".

0

처음에는 테이블 이름을 바꾸려면 % s를 사용하고 물음표를 사용하여 매개 변수 바꾸기를 만듭니다.

updateIndexMySQLQuery = """UPDATE %s 
SET numberID=? WHERE numberID=?;""" % (tableName,) 
... 
    self.cursorMySQL.execute(updateIndexMySQLQuery,(updateIndex,indexID)) 
+0

물음표 플레이스 홀더는 MySQLdb 와도 작동합니까 (sqlite3에서 사용하는 것으로 알고 있습니다)? – shylent

+0

그들은 다른 언어로 mysql과 함께 작동하므로 왜 안 보이지는 않습니다 ... DBAPI2.0 요구 사항입니까? –

+0

이 경우에 이것은 프로그래밍 언어 별 db-api의 사양이며, MySQL 자체와 관련이 있습니다 (잘못된 것일 수 있음). 나도 알아,이 파이썬의 데이터베이스 API 표준의 일부이지만, MySQLdb의 설명서는 % 스타일의 자리 표시자를 언급합니다. 나는 그것을 지금 시험 할 수 없으므로 나는 그것을 여러분에게 남겨 둘 것입니다 :) – shylent

0

감사합니다. 나는 단지 전체 기능을 다시했다. 다음은 작동 방식과 모양입니다.

def update_tableIndex(self,tableName,indexName): 

    getIndexMySQLQuery = """SELECT %s 
    FROM %s;""" % (indexName,tableName,) 

    updateIndex=1 
    self.cursorMySQL.execute(getIndexMySQLQuery) 
    for row in self.cursorMySQL: 
     indexID = row[0] 

     updateIndexMySQLQuery = """UPDATE %s 
     SET %s=%s WHERE 
     %s=%s;""" % (tableName, 
        indexName,updateIndex, 
        indexName,indexID) 

     self.cursorMySQL.execute(updateIndexMySQLQuery) 
     updateIndex+=1 

따라서 할 일은 매개 변수로 열 이름과 테이블 이름을 알리는 것입니다. 데이터베이스의 다른 모든 테이블에 대해 코드를 재사용 할 수 있습니다.

다른 사람들에게도 유용 할 수 있기를 바랍니다.

+0

아니요, 이것은 전혀 유용하지 않으며 사실 매우 위험합니다. 매개 변수 값을 쿼리에 연결하지 말고 데이터베이스 API에 그대로 두어야합니다. 전달할 매개 변수가 인용되고 올바르게 이스케이프 처리되는 것을 어떻게 보장합니까? 간단히 말해서, 그렇게하지 마십시오. – shylent