Pyodbcを使用してローカルファイルをリモートMS_SQLデータベースに一括挿入しようとしています。 DBに接続でき、INSERT INTO
テーブル、以前に行ったように。私が問題を抱えているのはBULK INSERT
。
使ってます BULK INSERT
INSERT
プロセスを高速化する方法として。
コードは次のようになります。
statement = """ BULK INSERT BulkTable FROM 'C:\\Users\\userName\\Desktop\\Folder\\Book1.csv' WITH (
FIRSTROW=2,
FIELDTERMINATOR=',',
ROWTERMINATOR = '\\n'
);
"""
cursor.execute(statement)
cnxn.commit()
このコードはこのエラーを生成します:
Traceback (most recent call last):
File "tester.py", line 41, in <module> cursor.execute(statement)
pyodbc.ProgrammingError:
('42000', '[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server] Cannot bulk load because the file "C:\\Users\\userName\\Desktop
\\Folder\\Book1.csv" could not be opened.
Operating system error code 3(The system cannot find the path specified.). (4861) (SQLExecDirectW)')`
パスが間違いなく正しいので、なぜファイルを開けないのか、本当にわかりません。
さらに情報が必要な場合はお知らせください。
"リモートMS_SQLデータベースにローカルファイルを一括挿入しようとしています"
ファイル指定'C:\\Users\\userName\\Desktop\\Folder\\Book1.csv'
は、Pythonコードを実行しているワークステーション上の有効なパスにすぎませんが、 BULK INSERTのドキュメント であるため、アプローチは機能していませんそれを説明します
data_fileは、SQL Serverが実行されているサーバーからの有効なパスを指定する必要があります。 data_fileがリモートファイルの場合は、UNC(Universal Naming Convention)名を指定します。
(強調鉱山)。つまり、BULK INSERTステートメントが実行中サーバー上なので、サーバーに関する限り、他のマシン(ワークステーションなど)のファイル指定は実際には「リモートファイル」です。つまり、SQL ServerはC:\Users\userName\Desktop\Folder\Book1
サーバー自体という名前のファイルを探し、それが失敗すると「パスが見つかりません」というエラーが発生します。
BULK INSERTを使用するには、次のいずれかが必要です。
sQL Serverが「参照」できるネットワーク共有にファイルを置き、そのファイルへのUNCパスを指定する、または
sQL Serverのローカルフォルダーにファイルをアップロードし、ファイルのローカル(サーバー)パスを指定します。
これらの選択肢のいずれも実現可能でない場合、Pythonからの他のオプションは、SQL Serverの bcpユーティリティ を呼び出すために subprocess モジュールを使用することです)ローカルファイルからSQL Serverデータベースへのデータ。