sql >> データベース >  >> RDS >> PostgreSQL

SQLAlchemyエンジンを使用せずにPostgresテーブルにデータフレームを書き込む方法は?

    これらの接続を使用して、SQLAlchemyを回避できます。これはかなり直感的ではないように聞こえますが、通常の挿入よりもはるかに高速になります(ORMを削除して、executemanyなどで一般的なクエリを実行した場合でも )。生のクエリを使用しても挿入は遅くなりますが、COPYが表示されます。 スピードアップする方法で何度か言及されていますPostgreSQLでの挿入パフォーマンス 。この場合、以下のアプローチに対する私の動機は次のとおりです。

    1. COPYを使用する INSERTの代わりに
    2. Pandasがこの操作の正しいSQLを生成することを信頼しないでください(ただし、IljaEveriläが指摘しているように、このアプローチは実際にはV0.24でパンダに追加
    3. 実際のファイルオブジェクトを作成するためにデータをディスクに書き込まないでください。すべてをメモリに保存します

    cursor.copy_from()を使用した推奨アプローチ

    import csv
    import io
    import psycopg2
    
    df = "<your_df_here>"
    
    # drop all the columns you don't want in the insert data here
    
    # First take the headers
    headers = df.columns
    
    # Now get a nested list of values
    data = df.values.tolist()
    
    # Create an in-memory CSV file
    string_buffer = io.StringIO()
    csv_writer = csv.writer(string_buffer)
    csv_writer.writerows(data)
    
    # Reset the buffer back to the first line
    string_buffer.seek(0)
    
    # Open a connection to the db (which I think you already have available)
    with psycopg2.connect(dbname=current_app.config['POSTGRES_DB'], 
                          user=current_app.config['POSTGRES_USER'],
                          password=current_app.config['POSTGRES_PW'], 
                          host=current_app.config['POSTGRES_URL']) as conn:
        c = conn.cursor()
    
        # Now upload the data as though it was a file
        c.copy_from(string_buffer, 'the_table_name', sep=',', columns=headers)
        conn.commit()
    

    これは、実際に挿入を行うよりも桁違いに高速である必要があります。




    1. DjangoモデルはMySQL関数を使用できますか?

    2. 日付フォーマット文字列がOracleで有効な日付フォーマット文字列であるかどうかをテストする方法

    3. AWSPostgresRDSテーブルをAWSS3にエクスポートする

    4. データベースダンプからknexシードファイルを生成することは可能ですか?