0

我在一个管理非常糟糕的遗留 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)")

cursor.execute()很明显,这是因为 pyodbc 在调用表时会尝试锁定表。这种行为非常有意义,因为cursor.execute()运行任意 SQL 代码并可能更改表。

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

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

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

4

3 回答 3

1

好的,我终于想通了。

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

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

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

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

于 2012-12-10T21:21:07.833 回答
0

确保您在此处pyobdc拥有(3.0.6)的最新版本,根据他们的说法,他们

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

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

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

另外,我已经在一个悖论服务器上使用它进行了测试readonly,它确实有效。

希望这可以帮助!

于 2012-12-10T19:40:40.020 回答
0

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

于 2015-10-15T16:15:58.480 回答