2009-08-25 10 views
1

私は、テキストファイルの処理を行うpythonスクリプトを作成しています。そのプロセスの一環として、タブ区切りファイルの各行をローカルのMS SQL Server(2008)テーブルにインポートする必要があります。私はpyodbcを使用しており、私はこれを行う方法を知っています。しかし、私はそれを実行するための最良の方法について質問があります。PythonでSQL Serverにテキストファイルをインポートする

ファイルの各行に対してcursor.execute(myInsertSQL)を作成してループします。すべてのレコードがループされるまで(つまり、ループの後にcommit()を実行し、個々の実行後にループ内にはない)まで、ステートメントをコミットするのを待っている問題は誰にも見えますか?私が尋ねる理由は、いくつかのファイルには5000行以上のファイルがあるということです。私は "それらを保存する"と一度にすべての5000をコミットしようとすると問題を引き起こすかどうかはわかりませんでした。

私はかなり新しいpythonです。だから私はまだこれらの問題のすべてを知っていません。

ありがとうございました。

+0

"「それらを保存して」5000を一度にコミットしようとすると問題が発生するかどうかはわかりませんでした。どのような "問題"を想像していますか?あなたはそれを試しましたか?それは何をしたのですか?ループ内からループの最後にコミットを移動することは、簡単に両方を行うことができ、学習した内容を含めることができる簡単な変更です。 –

+0

私は小さなセットで試してみましたが、問題はありませんでした。私が懸念していたのは、私がテストしていたときにはうまくいかないということではなく、おそらく天井がある場合には、私が注意を払うべきだということでした。ファイルはサイズが変わり、5000を超える可能性があります。私が書いているスクリプトは、スケジュールバッチの一部として実行され、私は問題にぶつからないようにしています。お勧めします。 –

+0

sqlserverのpythonインターフェイスは '.executemany'メソッドを提供しますか? –

答えて

0

あなたがしていることを理解していれば、Pythonは問題になることはありません。トランザクション内で文を実行しても、Pythonでは累積状態は作成されません。これは、データベースサーバー自体でのみ実行されます。

コミット時に、大量のバッチ・コミットを行うと、データベース内の変更が中断される可能性があるため、コミットが発生したことを確認する必要があります。コミットが失敗した場合は、再度バッチを再実行する必要があります。

のみ、私は大きなバッチとの認識しています問題やPython/ODBCだ(とあなたは関係なく、その問題を持っているであろうから、それは、でも本当にPythonの問題ではない。)今

、あなたがすべて作成された場合SQLをメモリに格納してからメモリ表現をループすると、それが意味をなさなくなります。それでも、現代のマシン上の5000行のテキストは、それほど大きな問題ではありません。 2桁以上処理する必要がある場合は、プロセスを再考する必要があります。

+0

洞察をいただきありがとうございます。私は、上記のexecutemanyのアイデアと組み合わせて、この情報が私が考える必要があるものだと思う。 –

0

ファイルを作成し、BULK INSER Tを使用します。これは高速になります。

+0

以前はBULK INSERTを使用していませんでしたが、調べる価値があります。私はこのスクリプトを明日にしなければならないので、今のところ最初のアプローチをとり、もっと時間があるときにBULK INSERTを再訪します。ありがとう。 –

+0

BULK INSERTには、データベースに対する追加の権限が必要な場合があります。私は彼らのために私たちのシステム管理者に尋ねなければならないことを知っている – tgray

関連する問題