できるだけ早くSQL Serverデータベースに挿入しようとしている、74個の比較的大きなパンダのデータフレーム(約34,600行と8列)があります。いくつかの調査を行った後、私は、良いOLE pandas.to_sql
機能は、私が取った最初のアプローチであったSQL Serverデータベースへのそのような大きな挿入には適していないことを学びました(非常に遅い - アプリケーションが完了するまでに約1時間。大きなパンダのデータフレームをSQL Serverデータベースに書き込む
私はではなく、SQLAlchemyののコアを使用しようとしています:mysqlデータベースを使用している場合)
This article、および他の多くのStackOverflowの記事をしかし私はバリケードを打ってきました、正しい方向に私を指している役立っています上記のリンクで説明されている理由でORM。だから、私は、辞書にデータフレームを変換pandas.to_dict
を使用して、とinsert()
をしています:
self._session_factory.engine.execute(
TimeSeriesResultValues.__table__.insert(),
data)
# 'data' is a list of dictionaries.
問題は、インサートは、任意の値を取得していないことである - 彼らは、空の括弧の束として表示され、Iこのエラーが表示される:
(pyodbc.IntegretyError) ('23000', "[23000] [FreeTDS][SQL Server]Cannot
insert the value NULL into the column...
私が渡した辞書のリストには値があります。なぜ値が表示されないのかわかりません。
EDITは:
ここで私はのオフつもり例です:あなたは、SQLAlchemyのは、実際にSQL Serverの一括インポートを実装していないため、私はいくつかの悲しいニュースを持っている
def test_sqlalchemy_core(n=100000):
init_sqlalchemy()
t0 = time.time()
engine.execute(
Customer.__table__.insert(),
[{"name": 'NAME ' + str(i)} for i in range(n)]
)
print("SQLAlchemy Core: Total time for " + str(n) +
" records " + str(time.time() - t0) + " secs")
*約4分のMySQLデータベースを使用して* ...そう 'to_sqlは()'だけで接続が可能なソリューションです。 MySQLと比較してMSSQLが遅いですか?どのODBC APIを使用していますか?データベースサーバーはローカルまたはリモートのどちらですか?一時テーブルのインポートを検討し、最終的なテーブルに移行します。 – Parfait
@Parfait: '' 'to_sql()' ''を使用すると、MySQLでは許容可能なパフォーマンスが得られますが、MSSQLでは許容されません。私はpyodbcを使用しています。データベースはリモートであるため、CSVファイルに書き込んでから、raw SQLコードを使用して一括挿入することは、この状況では実際には機能しません。さらに、ユーザーには一括管理権限が必要ですが、このアプリケーションのユーザーにとっては必ずしも可能ではない可能性があります。 – denvaar
odbcドライバをバイパスし、厳密にPython APIを使用することを検討してください - [pmyssl](http://www.pymssql.org/en/latest/)そしてMySQL ODBC API? pymysql?両方の同じテーブル構造とデータ型?同じ数のレコード?本当にこれを調べてください。どちらも高水準のエンタープライズRDMSであり、その広い範囲(4分〜60分)を実行すべきではありません。 – Parfait