2012-11-30 2 views
0

저는 매우 잘 관리되지 않은 레거시 Paradox 데이터베이스 시스템이있는 환경에서 작업하고 있습니다. (필자는 관리자가 아닙니다.) 저는 pyodbc를 사용하여 테이블과 상호 작용하는 것을 망설였습니다. 기본 기능이 작동하는 것 같습니다. 여기에 몇 가지 (작업) 테스트 코드는 다음과 같습니다pyodbc를 사용하여 Paradox gui에서 열려있는 Paradox 테이블을 읽을 수 있습니까?

import pyodbc 

LOCATION = "C:\test" 

cnxn = pyodbc.connect(r"Driver={{Microsoft Paradox Driver (*.db)\}};DriverID=538;Fil=Paradox 5.X;DefaultDir={0};Dbq={0};CollatingSequence=ASCII;".format(LOCATION), autocommit=True, readonly=True) 
cursor = cnxn.cursor() 
cursor.execute("select last, first from test") 
row = cursor.fetchone() 
print row 

문제는 우리의 중요한 테이블의 대부분은 거의 항상 누군가의 역설 GUI 오픈으로 바뀌 었다는 점이다. pyodbc이 cursor.execute()이 그것을 호출 될 때 테이블을 잠그려고하기 때문에

pyodbc.Error: ('HY000', "[HY000] [Microsoft][ODBC Paradox Driver] Could not lock 
table 'test'; currently in use by user '(unknown)' on machine '(unknown)'. (-1304) 
(SQLExecDirectW)") 

이 분명히있다 : 그 테이블 중 하나에서 select을하려고 할 때마다 나는이 오류가 발생합니다. 이 동작은 cursor.execute()이 임의의 SQL 코드를 실행하고 테이블을 변경할 수 있기 때문에 완벽합니다.

그러나 Paradox 자체 (GUI를 통해)는 여러 사용자를 올바르게 처리하는 것처럼 보입니다. 사람들이 테이블을 사용하는 동안 테이블을 재구성하려고하면 비슷한 오류 만 발생합니다.

pyodbc에서 일종의 읽기 전용 모드를 사용할 수있는 방법이 있습니까? 예를 들어 내가 할 때 테이블을 잠글 필요가 없습니다. select 등이 있습니까? 아니면 어떻게 돌아갈 수 있을지 모르는 작동 방식의 근본적인 부분을 잠그고 있습니까?

다른 모듈을 사용하는 솔루션도 문제가 없습니다.

+0

낮은 자격 증명 (읽기 전용 권한)으로 새 계정을 만들 수 있습니까? – enginefree

+0

그게 내가 "readonly = True"매개 변수가 할 것이라고 기대했지만, 그것은 나를 위해 작동하지 않았다. – PeterBB

+0

pyobdc의 버전은 무엇입니까? – enginefree

답변

1

좋아, 나는 마침내 그것을 알아 냈다.

분명히, odbc는 기본 키가없는 Paradox 테이블을 싫어합니다. 어떠한 상황에서도 기본 키가없는 테이블을 업데이트 할 수 없으며 기본 키가없는 테이블에서 해당 테이블에 액세스하려는 유일한 사용자가 아닌 경우 테이블을 읽을 수 없습니다.

비밀번호를 제공하지 않으면 비밀번호 보호 된 테이블과 근본적으로 같은 오류 메시지가 표시됩니다.

그래서 두 개의 다른 테이블에서 스크립트를 테스트했습니다. 그 중 하나에는 암호와 기본 키가 있고 그 중 하나에는 둘 다 없었습니다.오류 메시지의 근본 원인은 같다고 가정했지만 실제로는 서로 다른 두 가지 문제가있었습니다.

누군가의 GUI에서 열려있는 경우 기본 키가없는 테이블에 액세스 할 수있는 방법이없는 것 같지만 그게 더 작은 문제입니다.

0

것은 그들에 따르면, 당신은 pyobdc (3.0.6) here의 최신 버전이 있는지 확인하십시오, 그들은

추가 Cursor.commit()와 Cursor.rollback(). 과 커서를 연결을 추적하는 대신 코드에서 커서 만 사용할 수 있습니다.

연결할 읽기 전용 키워드가 추가되었습니다. True로 설정하면 SQLSetConnectAttr SQL_ATTR_ACCESS_MODE가 SQL_MODE_READ_ONLY로 설정됩니다. 이로 인해 일부 드라이버의 잠금 의미 또는 속도가 향상 될 수 있습니다.

4K보다 긴 SQL Server XML 데이터 형식을 읽는 동안 오류가 수정되었습니다.

또한, 나는 readonly를 사용 역설 서버에이를 테스트 한 작업을 수행합니다.

희망이 도움이됩니다.

+0

이것은 문제가되지 않았지만 (내 다른 게시물 참조), 나는 옳은 것을 생각하게 해주는 현상금을주고 있습니다. – PeterBB

0

방금 ​​Parxox 데이터베이스 파일을 pxlib C 라이브러리를 통해 읽으려는 Python 라이브러리 인 https://github.com/mherrmann/pypxlib을 게시했습니다. 이것은 파일 수준에서 작동하므로 다른 사람과 현재 독립적으로 데이터베이스를 읽을 수 있어야합니다. 읽기/쓰기 액세스를 동기화하지 않기 때문에 조심해야합니다!