0

fdb(2.0.1) と pyodbc を使用して、Firebird DB から MS Sql Server にデータを移行しようとしています。Firebird データベースには 64K を超えるブロブがあるため、それらは BlobReader オブジェクトとして返されます。自分でバイトを処理したくないので、pyodbc を使用して書き込みます。ドキュメントによると、cursor.set_stream_blob_threshold に -1 を渡すことで 64K のしきい値をオフにできます。ただし、 fdb.fbcore.ProgrammingError がスローされるため、機能しないようです...

https://fdb.readthedocs.io/en/v2.0/reference.html#fdb.Cursor.set_stream_blob_treshold

関数を呼び出す方法は次のとおりです。

import fdb

class Firebird:

    def __init__(self, db_name: str):
        self.__fb_conn = fdb.connect(database=db_name, user='someuser', password='somepass', charset='ISO8859_1')
        self.__fb_cursor = self.__fb_conn.cursor()

        #change the blob safety threshold to unlimited for troubleshooting
        self.__fb_cursor.set_stream_blob_treshold(-1) #doesn't work :(

エラーのスタック トレースは次のとおりです。

(.venv) >python3.8.exe -i
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from commonlibs import Firebird
>>>
>>> fb = Firebird('somedb.fdb')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\user1\dev\commonlibs\Firebird.py", line 13, in __init__
    self.__fb_cursor.set_stream_blob_treshold(int(-1)) #doesn't work :(
  File "C:\Users\user1\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\fdb\fbcore.py", line 3930, in set_stream_blob_treshold
    raise ProgrammingError
fdb.fbcore.ProgrammingError

マークのコメントによると、データ ソースとどのような種類の BLOB についてはよくわかりません。それは、他のチームの担当者が言った状況の 1 つでした。

ただし、obj.read() 値を BlobReader オブジェクトの pyodbc に渡そうとすると、いくつかのブロブが挿入されました。ただし、多くの場合、pyodbc は次のエラーを報告します。

 pyodbc.Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Warning: Partial insert/update. The insert/update of a text or image column(s) did not succeed. (0) (SQLPutData); [HY000] [Microsoft][ODBC SQL Server Driver][SQL Server]The text, ntext, or image pointer value conflicts with the column name specified. (7125)')

そのしきい値を設定することで、この pyodbc と .read() をすべて回避できることを期待していましたが、関係なく pyodbc エラーが表示されるかどうかは疑問です...

4

0 に答える 0