pyodbc访问Access数据库时存在MSysObjects权限问题

4
我正在尝试使用pyodbc访问一个Access数据库(.mdb)。我可以成功连接它 -
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 来更改它。有没有办法通过编程来解决这个问题?我需要知道数据库用户或类似的东西吗?

我在 Visual Basic 中看到了一个解决方法—我能否在 Python 中适应那个方法?我猜我需要一个不同的库(OLEDB)。

谢谢!


你不能从连接中获取模式吗?Access系统表不受支持,真的不适合这个。 - Fionnuala
或许:http://stackoverflow.com/questions/4539254/how-to-get-datatypes-of-specific-fields-of-an-access-database-using-pyodbc - Fionnuala
谢谢@Remou - 看起来非常有用。我正在研究它。 - user1458476
1
哈,我从没想过它会这么容易 - cursor.tables() 真是太好用了。写出来吧,@Remou - 你应该会得到很多赞 :-) - user1458476
2个回答

6
解决方案是使用以下代码片段中演示的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

我知道我来晚了,但最近我也遇到了同样的问题,所以想分享一下我编写的获取表/列模式的函数。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接