pyodbc访问数据库MSysObjects权限问题

时间:2012-06-15 11:10:41

标签: python ms-access pyodbc

我正在尝试使用.mdb访问Access数据库(pyodbc)。

我可以很好地连接到它 -

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')

它给了我 -

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

浏览,似乎是因为数据库已被“保护”。

我无法运行Access来更改它。有没有我可以以编程方式解决这个问题?我是否需要了解数据库用户或类似的东西?

I've seen a workaround in Visual Basic - 我有没有办法在Python中适应它?我想我需要一个不同的库(OLEDB)。

谢谢!

2 个答案:

答案 0 :(得分: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']

这可能是一种更清晰的编码方式,但我很着急;)

(归功于那些对原始问题发表评论的人;我刚刚发布了这段代码,因为我还是将其写入我的笔记中)

答案 1 :(得分: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)

您的想法是,您可以稍后将数据元组附加到具有列名称的列表中:

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