我在一个管理非常糟糕的遗留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之类的操作时,它就不必锁定表?或者锁定是它工作方式的一个基本部分,而我将无法解决?
使用其他模块的解决方案也完全可以。
发布于 2012-12-11 05:21:08
好了,我终于想明白了。
显然,odbc不喜欢没有主键的Paradox表。在任何情况下都不能更新没有主键的表,也不能从没有主键的表中读取数据,除非您是唯一尝试访问该表的用户。
与此无关的是,如果您不提供密码,您将从受密码保护的表中获得本质上相同的错误消息。
因此,我在两个不同的表上测试了我的脚本,其中一个表同时具有密码和主键,而另一个表既没有密码又有主键。我假设错误消息具有相同的根本原因,但实际上是两个不同的问题,具有不同的解决方案。
如果表是在某人的GUI中打开的,似乎仍然无法访问没有主键的表,但这是一个较小的问题。
发布于 2012-12-11 03:40:40
确保你有最新版本的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服务器上进行了测试,它确实可以工作。
希望这能有所帮助!
发布于 2015-10-16 00:15:58
我刚刚发布了一个Python库,用于通过pxlib C库https://github.com/mherrmann/pypxlib读取Paradox数据库文件。这是在文件级上操作的,因此还应该允许您独立于当前正在访问数据库的其他人来读取数据库。因为它不同步读/写访问,所以您必须小心!
https://stackoverflow.com/questions/13651087
复制相似问题