2012-06-15 3 views
2

pyodbc을 사용하여 Access 데이터베이스 (.mdb)에 액세스하려고합니다.pyodbc 데이터베이스 액세스 MSysObjects 사용 권한 문제

connection = pyodbc.connect(driver='{Microsoft Access Driver (*.mdb)}', dbp=path, pwd=password) 

를를 미세하지만 나는 그것의 테이블 - 목록을 가져올 수 MSysObjects를 쿼리 할 수 ​​없습니다에 내가 연결할 수

cursor = connection.cursor() 
cursor.execute('select * from MSysObjects where Type=1 and Flags=0') 

은 ME-에게

Record(s) cannot be read; no read permission on 'MSysObjects'. (-1907) (SQLExecDirectW) 
을 제공합니다

주위를 둘러 보면 데이터베이스가 "보호"되어있는 것 같습니다.

변경하려면 Access를 실행할 수 없습니다. 이 부분을 프로그램 적으로 해결할 수 있습니까? 데이터베이스 사용자 나 그와 비슷한 것을 알아야합니까?

I've seen a workaround in Visual Basic- 거기에 파이썬에서 적응할 수있는 방법이 있습니까? 나는 다른 라이브러리 (OLEDB)가 필요하다고 생각한다.

감사합니다.

(신용)

아마이 코딩의 깨끗한있는 방법은
import pyodbc 
connection = pyodbc.connect(driver='{Microsoft Access Driver (*.mdb)}', dbp=path, pwd=password) 
cursor = connection.cursor() 
tableNames = [x[2] for x in cursor.tables().fetchall() if x[3] == 'TABLE'] 

,하지만 난 서둘러 해요 :

+0

당신이 연결의 스키마를 가져올 수 없습니다 :

def get_schema(cursor): """ :param cursor: Cursor object to database :return: Dictionary with table name as key and list of columns as value """ db_schema = dict() tbls = cursor.tables().fetchall() for tbl in tbls: if tbl not in db_schema: db_schema[tbl] = list() # add table as key column_names = list() for col in cursor.columns(table=tbl): # concatenate column names column_names.append(col[3]) db_schema[tbl] = tuple(column_names) # store column names as value return dict(db_schema) 

아이디어는 나중에 열 이름이 목록에 데이터 튜플을 추가 할 수있다? 액세스 시스템 테이블은 지원되지 않으며 실제로는 적합하지 않습니다. – Fionnuala

+0

아마도 : http://stackoverflow.com/questions/4539254/how-to-get-datatypes-of-specific-fields-of-an-access-database-using-pyodbc – Fionnuala

+0

감사합니다. Remu- 매우 유용합니다. 나는 지금 그것을보고있다. – user1458476

답변

3

이 솔루션은 아래의 코드 조각에서 입증 된 바와 같이 cursor.tables()을 사용하는 것입니다 원래의 질문에 댓글을 달았던 사람들에게 간다. 어쨌든이 코드를 내 노트에 쓰고 있기 때문에 방금이 코드를 게시했다.)

0

나는 늦게 들어간다는 것을 알았지 만, 내가 테이블/컬럼을 가져 오기 위해 쓴 함수를 공유한다. 개요.

{'Table 1': [('Column 1-1', 'Column 1-2')], 
'Table 2': [('Column 2-1', 'Column 2-2', 'Column 2-3')]}