2017-02-08 29 views
1

読み取り専用の接続を作成しようとするときに問題があり、バグかエラーかどうかはわかりません。mssqlとpyodbcとの読み取り専用接続

Pyodbcのドキュメントでは、読み取り専用接続を作成できることを示しています。 https://mkleehammer.github.io/pyodbc/api-module.html

エラーが発生しても、READONLYキーワードがまったく存在しないかのように実行されます(更新が行われます)。

import pyodbc 

readonly_conn_str = "DRIVER={SQL Server Native Client 10.0};SERVER=...;DATABASE=...;UID=...;PWD=...;READONLY=True;" 
conn = pyodbc.connect(readonly_conn_str) 
cursor = conn.cursor() 
result = cursor.execute(update_query) 
cursor.commit() 
print(result.rowcount) 

私は同じことをする関数のキーワードを使用してみてください。

... 
conn = pyodbc.connect(conn_str, readonly=True) 
... 
+0

エラーが表示されますか?どこがうまくいかないの?何が行動ですか? – FlipperPA

+0

申し訳ありません。私はより明確になるように質問を更新しました – lwpaul

+0

おそらく* readonly *、小文字?これはドキュメントに表示される方法であり、解釈のためにODBCドライバに渡されません。 –

答えて

1

我々はreadonly=Truepyodbc.connectを呼び出すと、pyodbcは律儀

ret = SQLSetConnectAttr(cnxn->hdbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER)SQL_MODE_READ_ONLY, 0); 

SQL_MODE_READ_ONLYは、標準のODBC SQL_ATTR_ACCESS_MODE属性の一つであるODBC関数を呼び出します。実際にODBC接続の動作にどのような影響を与えるかは、ODBCドライバによって決まります。 ODBC documentationで述べたように:

SQL_MODE_READ_ONLYは、接続は更新が発生する原因となるSQL文をサポートするために必要されていないことを示す指標として、ドライバまたはデータ・ソースで使用されています。このモードは、ロック戦略、トランザクション管理、またはドライバやデータソースに適した他の領域を最適化するために使用できます。ドライバは、そのようなステートメントがデータソースに送信されないようにする必要はありません。読取り専用接続中に読取り専用ではないSQL文を処理するように要求されたときのドライバおよびデータ・ソースの動作は、実装定義です。

つまり、pyodbcは「読み取り専用」属性をODBCドライバに渡しました。ヒント、ハードな制限、または単に無視されるべきものとして解釈すべきかどうかを決定するのは、運転手の責任です。

関連する問題