2016-06-02 3 views
2

pyodbc에 SQL 주입을 피하기 위해 매개 변수화 된 쿼리를 사용하려고합니다. 아래 링크에 지정된 문서를 기반으로 :pyodbc에 대한 매개 변수화 된 쿼리 작성

cursor.execute("""Create table result (? bigint PRIMARY KEY , ? varchar(9), ? varchar(9))""",x[0],x[1],x[2]) 

    ProgrammingError: ('42000', "[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near '@P1'. (102) (SQLExecDirectW)") 

: 아래

In [57]: df 
Out[57]: 
      TXN_KEY SEND_AGENT PAY_AGENT 
0  13273870 ANO080012 API352676 
1  13274676 AUK359401 AED002782 
2  13274871 ACL000105 ACB020203 
3  13275398 AED420319 ASE094882 
4  13278566 ARA030210 AII071196 
5  13278955 AYM003098 AHX012817 
6  13280334 AJ5020114 AED000438 
7  13280512 A11171047 AEL051943 
8  13281278 AOG010045 ADJ031448 
9  13282118 AMX334165 APM033226 
10 13283955 APL170095 AE4082002 

x=df.columns.tolist() 
x 
Out[59]: [u'TXN_KEY', u'SEND_AGENT', u'PAY_AGENT'] 

는 SQL Server 데이터베이스에서 테이블을 만들 수있는 내 커서 명령입니다 : 아래 https://code.google.com/archive/p/pyodbc/wikis/GettingStarted.wiki#Parameters

dataframe입니다 그러나

x[0] 
    Out[63]: u'TXN_KEY'... 

등등. 마찬가지로 alter table add column에 대해서도 매개 변수화 된 쿼리를 사용하여 커서를 작성해야합니다. 삽입, 업데이트 및 선택하는 방법을 알고 있습니다. 나는 이것이 비슷한 선상에 있다고 생각했지만 분명히 그렇지 않다.

답변

1

그것은 추한이지만 컬럼에 매개 변수를 바인딩하지 않는 때문에,이 같은 (나는 그것을 테스트 한)을해야 할 것 :

cursor.execute("""Create table result ({} bigint PRIMARY KEY, {} varchar(9), {} varchar(9))""".format(x[0], x[1], x[2])) 

내가 매우 pyodbc에 대한 자세한 내용을 학습 추천 너무 많이 파기 전에. 업데이트 된 문서는 여기에 있습니다. Google 코드의 내용은 매우 오래되었습니다. http://mkleehammer.github.io/pyodbc/ SELECT, INSERT, DELETE 및 UPDATE에 대해 수행해야 할 작업을 문서화합니다. 마지막 세 개는 나중에 commit() 문이 필요합니다. 행운을 빕니다!

1

literals에 대해서만 매개 변수를 사용할 수 있습니다.

리터럴 옆에있는 테이블 이름, 열 이름 또는 SQL의 다른 부분에는 사용할 수 없습니다. 등 create table, alter table,

처럼하지만 SELECT/INSERT/UPDATE에 대한 매개 변수가있는 쿼리를 사용해야합니다/DELETE 문을 - 당신이하고 DDL 초 동안 사용하지 않아야 수없는 옆에

.