2010-04-08 3 views
2

pyodbc를 사용하여 기존 Access 2000 .mdb 파일과 통신하고 있습니다.pyodbc를 사용하여 MS Access MDB에 행을 삽입 할 때 매개 변수를 어떻게 이스케이프합니까?

내가 커서를 가지고,이 실행하려고 :

 
pyodbc.Error: ('HYC00', '[HYC00] [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented (106) (SQLBindParameter)') 

에 결과 그러나 이렇게

 
c.execute("INSERT INTO [Accounts] ([Name], [TypeID], [StatusID], [AccountCat], [id]) VALUES (?, ?, ?, ?, ?)", [u'test', 20, 10, 4, 2]) 

을 나는 단순히 문자에 물음표를 변경할 수 있습니다 이해 가치,하지만 내 경험에 데이터베이스를 통해 문자열의 적절한 이스케이프는 ... 꽤되지 않습니다.

PHP와 mysql 팀이 mysql_real_escape_string과 친구들을 데리고 올리 겠지만, pyodbc의 값을 이스케이프 처리하는 기능을 찾을 수 없습니다.

이 데이터를 (파이썬에서) 삽입하는 권장 방법이 무엇인지 알려 주시면 매우 도움이 될 것입니다. 또는 odbc 문자열을 이스케이프하는 파이썬 함수가 있으면 멋질 것입니다.

답변

2

음, 분명히 이것은 내게 다시 소리 지르는 액세스입니다.

이전에는 파이썬 정수를 삽입했습니다. 자, 파이썬 long을 삽입하려고했습니다.

매개 변수로 긴를 삽입 할 때, 난 그냥 그것을 실행 수정을 호출하기 전에 내 기능에이 코드를 추가

 
pyodbc.Error: ('HYC00', '[HYC00] [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented (106) (SQLBindParameter)') 

수 :

 
    for k, v in new.items(): 
     new[k] = int(v) if isinstance(v, long) else v 

IOW, int 치의과 갈망을 교체하는 것은 잘 작동 . Go Access, 설명적인 오류.

엄밀히 말하면, 나는 이것이 pyodbc의 버그라고 생각하지 않지만이 특정 드라이버를 다룰 ​​때의 문제라고 생각합니다. 어쨌든 도움을 주셔서 감사합니다.

+0

파이썬 긴 데이터 형식의 정의는 무엇입니까? 그것이 제트 긴 정수의 용량을 초과하면, 그 이유는 그것을 사용할 수 없기 때문입니다. 그것이 문제의 원인 인 경우 파일럿 오류 인 것처럼 보입니다. 즉, 대상 데이터베이스의 데이터 유형을 완전히 이해하지 않고 무언가를 시도했습니다. –

+0

파이썬에서 long은 임의의 용량을 가지고 있습니다. 파이썬은 필요에 따라 int를 투명하게 승격 시키지만 자동으로 강등시키지 않습니다. 따라서 int (24)는 long이지만 integer (24)는 long이지만 int (2400000000)과 long (2400000000)은 모두 long입니다. 따라서 파이썬 프로그래머가 자신의 프로그램이 longs, ints 또는이 두 가지를 혼합하여 사용하는지 여부를 알지 못하는 것은 매우 합리적입니다. pyodbc가 범위에 있다면 둘 다 받아 들일 것으로 기대하는 것은 무리가 아닙니다. –