4

我正在尝试.mdb使用pyodbc.

我可以很好地连接它——</p>

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

但我无法查询MSysObjects以获取其表的列表—</p>

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

它给了我——</p>

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

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

我无法运行 Access 来更改它。有什么地方可以以编程方式解决这个问题吗?我需要知道数据库用户或类似的东西吗?

我在 Visual Basic 中看到了一种解决方法——有没有一种方法可以在 Python 中进行调整?我猜我需要一个不同的库(OLEDB)。

谢谢!

4

2 回答 2

5

解决方案是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']

可能有一种更简洁的编码方式,但我很着急;)

(感谢那些对原始问题发表评论的人;我刚刚发布了这段代码,因为无论如何我都要把它写到我的笔记中)

于 2014-12-04T05:26:21.657 回答
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')]}
于 2016-02-11T20:27:12.413 回答