是否可以使用 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 表?的主要内容,如果未能解决你的问题,请参考以下文章