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)")

これは明らかに、pyodbccursor.execute()が呼び出されたときにテーブルをロックしようとするためです。cursor.execute()任意の SQL コードを実行し、テーブルを変更する可能性があるため、この動作は完全に理にかなっています。

ただし、Paradox 自体は (その GUI を通じて) 複数のユーザーをうまく処理しているようです。人々がテーブルを使用しているときにテーブルを再構築しようとすると、同様のエラーが発生するだけです。

私がやっているときにテーブルをロックする必要がないように、pyodbcにある種の読み取り専用モードを使用させる方法はありますselectか? それともロックは、私が回避できない仕組みの基本的な部分なのでしょうか?

他のモジュールを使用するソリューションもまったく問題ありません。

4

3 に答える 3

1

わかりました、私はついにそれを理解しました。

どうやら、odbc は主キーのない Paradox テーブルを嫌います。どのような状況でも主キーのないテーブルを更新することはできず、そのテーブルにアクセスしようとしている唯一のユーザーでない限り、主キーのないテーブルから読み取ることはできません。

これとは関係なく、パスワードを指定しないと、パスワードで保護されたテーブルから本質的に同じエラー メッセージが表示されます。

そのため、2 つの異なるテーブルでスクリプトをテストしていました。そのうちの 1 つはパスワードと主キーの両方を持ち、もう 1 つはどちらも持っていませんでした。エラー メッセージの根本的な原因は同じだと思っていましたが、実際には 2 つの異なる問題であり、解決策も異なりました。

テーブルが誰かの GUI で開かれている場合、主キーなしでテーブルにアクセスする方法はまだないようですが、それは小さな問題です。

于 2012-12-10T21:21:07.833 に答える
0

ここpyobdcに(3.0.6)の最新バージョンがあることを確認してください、彼らによると、彼らは

Cursor.commit()とCursor.rollback()が追加されました。接続とカーソルを追跡する代わりに、コードでカーソルのみを使用できるようになりました。

接続する読み取り専用キーワードを追加しました。Trueに設定すると、SQLSetConnectAttrSQL_ATTR_ACCESS_MODEはSQL_MODE_READ_ONLYに設定されます。これにより、一部のドライバーのロックセマンティクスまたは速度が向上する場合があります。

4Kより長いSQLServerXMLデータ型の読み取りエラーを修正しました。

readonlyまた、を使用してパラドックスサーバーでこれをテストしましたが、機能ます。

お役に立てれば!

于 2012-12-10T19:40:40.020 に答える
0

pxlib C ライブラリ経由で Paradox データベース ファイルを読み取るための Python ライブラリを公開しました: https://github.com/mherrmann/pypxlib。これはファイルレベルで動作するため、現在アクセスしている他のユーザーとは無関係にデータベースを読み取ることもできます。読み取り/書き込みアクセスを同期しないため、注意が必要です。

于 2015-10-15T16:15:58.480 に答える