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

时间:2012-11-30 18:36:50

标签: python odbc pyodbc paradox

我在一个管理非常糟糕的传统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时它不必锁定表格等等?或者锁定其工作原理的基本部分,我将无法绕过它?

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

3 个答案:

答案 0 :(得分:1)

好的,我终于明白了。

显然,odbc不喜欢没有主键的Paradox表。在任何情况下都无法更新没有主键的表,除非您是唯一尝试访问该表的用户,否则无法读取没有主键的表。

如果您不提供密码,则无法从密码保护的表中获得相同的错误消息。

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

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

答案 1 :(得分:0)

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

  

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

     

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

     

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

另外,我使用readonly在一个paradox服务器上对此进行了测试,并且 可以正常运行。

希望这有帮助!

答案 2 :(得分:0)

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