2012-10-09 4 views
3

Mac OS X에서 pyodbc를 사용하여 DB2 데이터베이스에 연결하려고하는데이 작업을 수행 할 수 없습니다. 비슷한 조건에서 FreeTDS를 사용하여 MS SQL Server에 성공적으로 연결할 수있었습니다.Mac OSX에서 pyodbc를 사용하는 DB2

먼저 IBM에서 db2exc_client_952_MAC_x86_64를 설치했습니다. 성공적으로 설치 한 후 ODBC 관리자를 통해 드라이버를 추가했습니다. 나는 HY000은 ConnectionString에 문제가 될 수 있다는 것을 검색에서 수집

Traceback (most recent call last): File "", line 1, in pyodbc.Error: ('HY000', '[] \xf8\x92\x90\x81\x9b\xf8\x93\x90\x81\x82\xf8\x96\xb0\x81\x9d\xf8\x93\x80\x81\x83\xf8\x88\x80\x81\x89\xf8\x9c\xa0\x81\x84\xf8\x9d\xa0\x81\xa9\xf8\x9c\xa0\x81\xa5\xf8\x88\x80\x81\x9d\xf8\x94\x90\x81\x93\xf8\x8c\x90\x81\x8c\xf8\x8c\xa0\x80\xb0\xf8\x93\xa0\x80\xb4\xf8\x88\x80\x80\xa0\xf8\x88\x80\x81\x81\xf8\x98\x90\x81\xa4\xf8\x98\x90\x81\xb4\xf8\x98\x90\x81\xa2\xf8\x99\x90\x81\xb3\xf8\x98\xb0\x80\xa0\xf8\x9b\xa0\x81\xaf\xf8\x99\x90\x81\xae\xf8\x9d\x80\x81\xa3\xf8\x9b\xb0\x81\xa9\xf8\x88\x80\x81\xae\xf8\x9b\xb0\x81\xa4\xf8\x9c\xb0\x81\xa5\xf8\x9b\xa0\x80\xa0\xf8\x9d\x80\x81\xaf\xf8\x99\x90\x80\xa0\xf8\x9a\x90\x81\xb8\xf8\x9d\x80\x81\xb3\xf8\x88\x80\x80\xae\xf8\x94\xb0\x80\xa0\xf8\x93\x80\x81\x91\xf8\x95\x80\x81\x93\xf8\x95\x80\x81\x81\xf8\x8f\x90\x81\x85\xf8\x8e\x80\x80\xb0\xf8\x8c\x80\x80\xb0\xf2\xa0\x80\xb3\xfc\xa0\x9c\xb0\x80\x80\xfd\xa1\x99\x82\x81\xa1\xfd\xa1\x98\xa6\x85\xb4\xfd\xa9\x88\x86\x95\xb3\xfd\x82\x91\x82\x81\xae\xfd\xaf\x99\xa2\x80\xb2\xfd\x96\x93\x92\x81\xb2\xfd\x93\x82\xa2\xb9\x93\xff\x7f (-1024) (SQLDriverConnect)')

: ODBC Administrator

그때 나는이 파이썬 실행 시도했다 :

import pyodbc 
cnxn = pyodbc.connect('Driver={IBM DB2 ODBC Driver}; Hostname=myhost.com; Port=50300; Protocol=TCPIP; Database=DB2ET; CurrentSchema=SCHM1; UID=MYUID; PWD=MYPWD;'); 

을 그리고 난이 오류가 나타납니다 하지만 나머지 오류를 해독하는 방법을 모르겠습니다.

아이디어가 있으십니까?

+0

생각? ODBC Adminstrator에서 ODBC 드라이버 설정에 문제가 있습니다. – cabe56

+0

@ cabe56 아니요. 불행히도 이것을 파악하지 못했습니다. 내 다음 생각은 DB2에 DbVisualizer를 사용하여 DB2에 액세스 할 수 있기 때문에 http://py4j.sourceforge.net/index.html과 같은 것을 사용하는 것이 었습니다 (후드에서 JAVA를 사용한다고 생각합니다). – macca1

답변

1

연결 문자열은 데이터베이스에 따라 다르며 사용중인 연결 문자열은 DB2와 호환되지 않습니다. 그에

http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.swg.im.dbclient.adonet.ref.doc%2Fdoc%2FDB2ConnectionClass.html

을 기반 :

http://www.connectionstrings.com/ibm-db2

여기가 DB2 연결 문자열에서 유효 무엇으로 찾을 수있는 가장 좋은 참조입니다 : 여기

는 일부 DB2 예제 연결 문자열입니다 연결 문자열을 다음과 같이 변환합니다.

Driver={IBM DB2 ODBC Driver}; Hostname=myhost.com; Port=50300; Protocol=TCPIP; Database=DB2ET; CurrentSchema=SCHM1; UID=MYUID; PWD=MYPWD; 

에 :

Driver={IBM DB2 ODBC Driver}; Server=myhost.com:50300; Database=DB2ET; CurrentSchema=SCHM1; UID=MYUID; PWD=MYPWD; 
+0

제안에 감사하지만 해당 연결 문자열로 변경 한 후에도 여전히 잘못된 깨진 오류가 표시됩니다. 나는 10 종류 이상의 연결 문자열을 시도했지만 지금까지 아무도 시도하지 못했습니다. 내 원래 게시물에있는 하나는 실제로 하나의 Windows에서 작동합니다. – macca1

+0

흠. 이 링크 http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.apdv.cli.doc%2Fdoc%2Fr0000584.html은 HY000은 연결 문자열의 정보가 충분하지 않기 때문에 대화 상자를 요구하고 싶습니다. 연결 문자열에서 UID 및 PWD를 인라인 할 수 없도록하는 데이터베이스 서버에 정책이 설정되어 있습니까? UID와 PWD가없는 연결 문자열을 사용해 보셨습니까? 그리고 그 문제에 대한, 데이터베이스 및 CurrentSchema없이? –

1

다음은 PHP에서처럼 내 연결 문자열이 어떻게 표시되는지를 보여줍니다 (난 당신이 파이썬을 사용하고 알고 있지만 나는 그들이 매우 유사하다고 생각) : 나는

$this->db_connection = new PDO("odbc:DRIVER={iSeries Access ODBC Driver};SYSTEM=10.xxx.xxx.xxx;PROTOCOL=TCPIP", $temp_username, $temp_password); 

주의 말을 그 "SYSTEM = ..."그리고 당신은 "Hostname = ..."이라고 말하면 - 그것이 중요 할 수 있다고 생각합니다.

DSN이 완전히 설정 되었습니까? 제 리눅스 컴퓨터에는 DSN을위한 모든 구성 정보가 들어있는 두 개의 파일이 있습니다.

[primary] 
Description    = primary 
Driver     = iSeries Access ODBC Driver 
System     = xxx.xxx.xxx.xxx 
UserID     = xxxxxxxxxx 
Password    = xxxxxxxxxx 
Naming     = 0 
DefaultLibraries  = QGPL 
Database    = xxxxxxxxxx 
ConnectionType   = 0 
CommitMode    = 2 
ExtendedDynamic   = 0 
DefaultPkgLibrary  = QGPL 
DefaultPackage   = A/DEFAULT(IBM),2,0,1,0,512 
AllowDataCompression = 1 
LibraryView    = 0 
AllowUnsupportedChar = 0 
ForceTranslation  = 0 
Trace     = 0 

ODBC.INI 및

[iSeries Access ODBC Driver] 
Description  = iSeries Access for Linux ODBC Driver 
Driver   = /usr/lib/libcwbodbc.so 
Setup   = /usr/lib/libcwbodbcs.so 
NOTE1   = If using unixODBC 2.2.11 or later and you want the 32 and 64-bit ODBC drivers to share DSN's, 
NOTE2   = the following Driver64/Setup64 keywords will provide that support. 
Driver64  = /usr/lib/lib64/libcwbodbc.so 
Setup64   = /usr/lib/lib64/libcwbodbcs.so 
Threading  = 2 
DontDLClose  = 1 
UsageCount  = 1 

ODBCINST.INI

나는 당신이 아마 DSN 탭에서, 당신이 보여주는 대화 상자에서 유사한 정보를 입력 생각합니다.

ODBC 추적을 활성화 했습니까? 리눅스에서 이것을하기 위해서 나는 이것을 odbcinst에 추가해야한다.INI 파일 :

[ODBC] 
Trace = Yes 
TraceFile = /tmp/odbc.log 

이 나를 위해 많은 정보를 덤프 내가 과거에 했어 몇 가지 문제를 진단하는 데 도움을 주었다.

이 페이지 (http://code.google.com/p/pyodbc/wiki/ConnectionStrings)에 따르면 "가장 중요한 점은 pyodbc가 연결 문자열을 보지 않는다는 것입니다. 수정되지 않은 SQLDriverConnect로 직접 전달됩니다. " 그게 사실이라면 "호스트 이름"을 "시스템"으로 바꾸는 것이 트릭을해야합니다.

편집

모든 가능성이 인코딩에 문제가 될 수 있을까? 유니 코드가 UTF-8 서버 (또는 비슷한 것)와 대화하려고합니까? CCSID 설정을 시도 했습니까? 드라이버를 구성 할 때 "BinAsChar", "CCSID"또는 "Host CCSID"와 같은 옵션이 있습니까? 기본적으로

나는 CCSID가 37 (미국/캐나다)이라고 생각하고이 일을 알아낼나요 나는 유니 코드 1208

관련 문제