是否可以使用 pyodbc 读取在 Paradox gui 中打开的 Paradox 表?

Posted

技术标签:

【中文标题】是否可以使用 pyodbc 读取在 Paradox gui 中打开的 Paradox 表?【英文标题】:Is it possible to use pyodbc to read Paradox tables that are open in the Paradox gui? 【发布时间】:2012-11-30 18:36:50 【问题描述】:

我在一个管理非常糟糕的旧 Paradox 数据库系统的环境中工作。 (我不是管理员。)我一直在使用 pyodbc 与我们的表进行交互,基本功能似乎可以工作。这是一些(工作)测试代码:

import pyodbc

LOCATION = "C:\test"

cnxn = pyodbc.connect(r"Driver=Microsoft Paradox Driver (*.db )\;DriverID=538;Fil=Paradox 5.X;DefaultDir=0;Dbq=0;CollatingSequence=ASCII;".format(LOCATION), autocommit=True, readonly=True)
cursor = cnxn.cursor()
cursor.execute("select last, first from test")
row = cursor.fetchone()
print row

问题在于,我们大多数重要的表几乎总是会在某人的 Paradox GUI 中打开。每当我尝试从其中一个表中执行 select 时,我都会收到此错误:

pyodbc.Error: ('HY000', "[HY000] [Microsoft][ODBC Paradox Driver] Could not lock 
table 'test'; currently in use by user '(unknown)' on machine '(unknown)'. (-1304) 
(SQLExecDirectW)")

这显然是因为 pyodbc 在调用 cursor.execute() 时会尝试锁定表。这种行为非常合理,因为cursor.execute() 运行任意 SQL 代码并且可以更改表。

但是,Paradox 本身(通过其 gui)似乎可以很好地处理多个用户。如果您在人们使用表格时尝试重组表格,它只会给您类似的错误。

有什么方法可以让 pyodbc 使用某种只读模式,这样当我只是在做 select 等时它就不必锁定表?还是锁定了我无法解决的工作原理的基本部分?

使用其他模块的解决方案也完全没问题。

【问题讨论】:

您是否可以创建一个具有较低凭据(只读权限)的新帐户? 这就是我希望“readonly=True”参数能做到的,但它对我不起作用。 你有什么版本的pyobdc? 天哪,好问题。我以为我有最新版本,但实际上我使用的是与 PortablePython 捆绑在一起的任何东西。我将不得不尝试手动获取最新版本,看看是否有帮助。 【参考方案1】:

好吧,我终于想通了。

显然,odbc 不喜欢没有主键的 Paradox 表。在任何情况下都不能更新没有主键的表,也不能从没有主键的表中读取数据,除非您是唯一尝试访问该表的用户。

不相关的是,如果您不提供密码,您会从受密码保护的表中获得基本相同的错误消息。

所以我在两个不同的表上测试我的脚本,其中一个有密码和主键,而另一个没有。我认为错误消息具有相同的根本原因,但实际上是两个不同的问题,具有不同的解决方案。

如果它们在某人的 GUI 中打开,似乎仍然无法访问没有主键的表,但这是一个较小的问题。

【讨论】:

【参考方案2】:

确保您拥有最新版本的pyobdc (3.0.6)here,据他们说,他们

添加了 Cursor.commit() 和 Cursor.rollback()。现在可以使用 代码中只有一个光标,而不是跟踪连接 和一个光标。

添加了只读关键字来连接。如果设置为 True,则 SQLSetConnectAttr SQL_ATTR_ACCESS_MODE 设置为 SQL_MODE_READ_ONLY。这可能提供 为某些驱动程序提供更好的锁定语义或速度。

修复了读取超过 4K 的 SQL Server XML 数据类型的错误。

另外,我已经在使用 readonly 的 paradox 服务器上对此进行了测试,它确实有效。

希望这会有所帮助!

【讨论】:

这并不是问题所在(请参阅我的另一篇文章),但我会奖励你让我思考正确的事情。【参考方案3】:

我刚刚发布了一个 Python 库,用于通过 pxlib C 库读取 Paradox 数据库文件:https://github.com/mherrmann/pypxlib。这在文件级别上运行,因此还应该让您独立于当前正在访问它的其他人来读取数据库。由于它不同步读/写访问,但您必须小心!

【讨论】:

以上是关于是否可以使用 pyodbc 读取在 Paradox gui 中打开的 Paradox 表?的主要内容,如果未能解决你的问题,请参考以下文章

读取 Paradox 数据库文件

是否可以从 Paradox 连接到 SQL Server?

在 Windows 7(32 位)上运行 2 个读取 Paradox 表的应用程序失败

将 PHP 连接到 Paradox 数据库

将 dBase / Paradox 数据读入 R?

32 位 pyodbc 读取 64 位访问 (accdb)