2012-06-15 1 views
2

Я пытаюсь получить доступ к базе данных Access (.mdb), используя pyodbc.pyodbc Доступ к базе данных Выдача разрешений MSysObjects

Я могу подключить к нему

выполнить точную
connection = pyodbc.connect(driver='{Microsoft Access Driver (*.mdb)}', dbp=path, pwd=password) 

Но я не могу запросить MSysObjects, чтобы получить список его tables-

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

Это дает мне-

Record(s) cannot be read; no read permission on 'MSysObjects'. (-1907) (SQLExecDirectW) 

Обход, похоже, потому, что база данных была «защищена».

Я не могу запустить Access, чтобы изменить его. Есть ли где-нибудь, что я могу решить эту программу? Нужно ли мне знать пользователей базы данных или что-то в этом роде?

I've seen a workaround in Visual Basic - Есть ли способ, которым я мог бы адаптировать это в Python? Я бы предположил, что мне нужна другая библиотека (OLEDB).

Спасибо!

+0

Вы можете не получить схему из соединения? Таблицы системы Access не поддерживаются и не подходят для этого. – Fionnuala

+0

Возможно: http://stackoverflow.com/questions/4539254/how-to-get-datatypes-of-specific-fields-of-an-access-database-using-pyodbc – Fionnuala

+0

Благодаря @ Remou - это выглядит очень полезно. Я смотрю на него сейчас – user1458476

ответ

3

Решение использовать cursor.tables(), как показано в коде-фрагменте ниже:

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

Я понимаю, что прихожу поздно, но у меня недавно была эта проблема и я подумал, d делит функцию, которую я написал для получения таблицы/столбца схемы.

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) 

Идея заключается в том можно позже добавить кортежей данных в список, который имеет имена столбцов:

{'Table 1': [('Column 1-1', 'Column 1-2')], 
'Table 2': [('Column 2-1', 'Column 2-2', 'Column 2-3')]} 
Смежные вопросы