2016-11-22 6 views
2

테이블의 일부 데이터를 업데이트하지만 작동하도록 쿼리를 가져올 수없는 SQL 쿼리를 PyQt5에 작성하려고합니다. 무수한 포럼을 읽었지만 내 코드가 정확하다는 것을 알 수있는 한. 나는 또한 설명서를 다시 읽어서 뭔가를 놓친 것일까 요?바인딩이있는 PyQt SQL 쿼리

저는 PyQt5, python3.5 및 SQLITE를 사용하고 있습니다. 다음 코드 (lastError/lastQuery 도시하지 않음) :

near "?": syntax error Unable to execute statement 
near "?": syntax error Unable to execute statement 
UPDATE :tbl SET value=:val WHERE property=:var 
Parameter count mismatch 

나는 음모를 잃었 :

self.sqlWrite('ct','MarkerSize',123) 

def sqlWrite(self,tbl,var,val): 
     query = QtSql.QSqlQuery(self.db) # First create query instance. 
     # Prepare query with placeholders, then bind values. 
     query.prepare('UPDATE :tbl SET value=:val WHERE property=:var') 
     query.bindValue(0,tbl) 
     query.bindValue(1,val) 
     query.bindValue(2,var) 
     # Finally execute query. 
     query.exec_() 

... 오류를 생산? 내가 뭘 놓치고 있니?

미리 감사드립니다.

+1

그냥 추측 : 쿼리의 driver 사용, 식별자를 탈출 더 일반적인 방법을

query.prepare('UPDATE "%s" SET value=:val WHERE property=:var' % tbl) query.bindValue(':val', val) query.bindValue(':var', var) 

: 후자의 경우는 일반 문자열 보간을 사용한다 : 문자열 값에 대한 UPDATE 문에서 자리 표시 자 주위에 이스케이프 문자 (작은 따옴표 또는 큰 따옴표)가 필요합니까? –

답변

4

테이블 이름은 매개 변수가 아니므로 값을 바인딩 할 수 없습니다. 자리 표시자는 임의의 문자열이 아닌 리터럴 값과 함께 사용됩니다. 내가 PyQt5 사용한 적이 있기 때문에,

tbl = query.driver().escapeIdentifier(tbl, QSqlDriver.TableName) 
    query.prepare('UPDATE %s SET value=:val WHERE property=:var' % tbl) 
+0

이것은 완벽합니다. 방금 테이블 이름이 매개 변수로 포함되었다고 가정했는데,이 것이 SQL일까요? (내 SQL 지식은 매우 제한적이다.) – NineTails

+0

@NineTails. 매개 변수는 동적 * 런타임 * 변수입니다. 식별자 (예 : 테이블 이름)는 정적이며 * 컴파일 시간 * (즉, 명령문이 준비 될 때)에 알려 져야합니다. 준비된 문장은 대수의 표현식과 같습니다. 변수의 * 리터럴 값 *을 변경하면 항상 동일한 종류의 결과가 제공됩니다. 그러나 변수의 * 이름을 변경하면 아마 그렇지 않을 것입니다. – ekhumoro