2017-03-07 8 views
0

SQLite 쿼리에 변수를 삽입하는 올바른 구문을 찾고있는 다른 온라인 연구뿐만 아니라 Stack Overflow를 통해 검색했습니다. 그러나 지원되는 3 가지 구문 중 하나도 내 쿼리에 적용되지 않았습니다.SQLite DB-API 문법 Python 3.5 문제

qmark: 
curs.execute("SELECT * FROM actors where actor.first_name = ?",("D'Angelo",)) 

numeric: 
curs.execute("SELECT * FROM actors where actor.first_name = :1", ("D'Angelo",)) 

named: 
curs.execute("SELECT * FROM actors where actor.first_name = :first_name",{'first_name': "D'Angelo"}) 

http://www.philvarner.com/test/ng-python3-db-api/

에서 가져온 나는 다음을 실행할 때 그러나, 나는 이러한 오류가 나타납니다 :

나는 SQLite는 DB-API에 대한 지원되는 세 가지 구문이있는 것을 발견

named: 

tableListQuery = "SELECT name FROM :dbFile WHERE type='table' ORDER BY Name", {'dbFile': dbFile} 
userCursor.execute(tableListQuery) 

Pycharm error: Expected type 'str', got 'Tuple[str, Dict[str, Any]]' 

Terminal error: 
File "./dedupeDatabase.py", line 15, in Describe 
userCursor.execute(tableListQuery) 
ValueError: operation parameter must be str 
------------------------------------------------- 
qmark: 

tableListQuery = "SELECT name FROM ? WHERE type='table' ORDER BY Name", (dbFile,) 
userCursor.execute(tableListQuery) 

Pycharm error: Expected type 'str', got 'Tuple[str, Tuple[Any]]' instead 

Terminal error: 
File "./dedupeDatabase.py", line 15, in Describe 
userCursor.execute(tableListQuery) 
ValueError: operation parameter must be str 
------------------------------------------------- 
numeric: 

tableListQuery = "SELECT name FROM :1 WHERE type='table' ORDER BY Name", (dbFile,) 
userCursor.execute(tableListQuery) 

Pycharm error: Expected type 'str', got 'Tuple[str, Tuple[Any]]' 

Terminal error: 
File "./dedupeDatabase.py", line 15, in Describe 
userCursor.execute(tableListQuery) 
ValueError: operation parameter must be str 

이 문제에 대한 통찰력을 제공해주십시오.

+3

쿼리의 테이블 이름을 매개 변수화 할 수 없습니다. [here] (http://stackoverflow.com/questions/1274432/sqlite-parameters-not-allowing-tablename-as-parameter)를 참조하십시오. 이 값은 직접 (외부 소스에서 온 경우) 위조해야하고'.format() '을 사용하여 쿼리 문자열에 넣어야합니다. – roganjosh

+0

이것이 사실이지만 OP가 문제가되는 원인이 아닙니다 만남; 이는 단순히 파이썬 구문 문제 일뿐입니다. 튜플을 정의하고 쿼리 문자열과 매개 변수를 별도로 전달하지 않고'execute' 메서드에 전달하려고합니다. –

+0

파이썬에서 이러한 값을 'sanitze'할 수있는 샘플 코드를 제공해 주실 수 있습니까? 나는 당신이 무엇을 의미하는지 확신하지 못했습니다. –

답변

2

따라서 근본적인 문제는 구문 중 하나 일뿐입니다. tableListQuery"my query string", params으로 정의하면 튜플이 정의됩니다. 당신은 그 튜플을 execute에 직접 넘겨 줄 수는 없으며 문서는 당신이 할 수 있다고 말하지 않습니다. [1]

tableListQuery = "SELECT name FROM table WHERE type=:dbFile ORDER BY Name" 
params = {'dbFile': dbFile} 
userCursor.execute(tableListQuery, params) 

의견에서 지적했듯이 이제, 당신은 필드 또는 같은 것들에 대한 SQL 매개 변수를 사용할 수있는 두 번째 문제입니다 : 당신이 인용 원래 코드에서와 같이

당신은 할 필요가 테이블 이름; WHERE 값에 대해서만. 이를 위해서는 일반적인 파이썬 문자열 형식을 사용해야합니다.

[1] * 연산자로 처리 할 수 ​​있지만이 시점에서는 혼란 스러울 것입니다.