pyodbc 访问数据库 MSysObjects 权限问题
Posted
技术标签:
【中文标题】pyodbc 访问数据库 MSysObjects 权限问题【英文标题】:pyodbc Access database MSysObjects permissions issue 【发布时间】:2012-06-15 11:10:41 【问题描述】:我正在尝试使用 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 来更改它。有什么地方可以以编程方式解决这个问题吗?我需要知道数据库用户或类似的东西吗?
I've seen a workaround in Visual Basic——有没有办法在 Python 中进行调整?我想我需要一个不同的库 (OLEDB)。
谢谢!
【问题讨论】:
您不能从连接中获取架构吗? Access 系统表不受支持,确实不适合此。 或许:***.com/questions/4539254/… 谢谢@Remou——这看起来很有用。我现在正在研究它 哈,我从没想过会这么简单——cursor.tables()
就像一个魅力。写下来,@Remou——你值得点赞 :-)
【参考方案1】:
解决方案是使用cursor.tables()
,如下面的code-sn-p所示:
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']
可能有一种更简洁的编码方式,但我很着急;)
(感谢那些对原始问题发表评论的人;我刚刚发布了这段代码,因为无论如何我都要把它写到我的笔记中)
【讨论】:
【参考方案2】:我意识到我来晚了,但我最近遇到了同样的问题,并想分享我为获取表/列架构而编写的函数。
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')]
【讨论】:
以上是关于pyodbc 访问数据库 MSysObjects 权限问题的主要内容,如果未能解决你的问题,请参考以下文章
通过 sqlalchemy 和 pyodbc 访问 MS SQL 数据库时出现“登录超时”错误