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

to_sql + sqlalchemy+コピー元+postgresqlエンジン?

    これは完全に真実ではありません。これを実装して、COPY FROMを使用できます。 kwargmethodに独自の関数を提供する そのto_sql 受け入れます。 DataFrameのPandasドキュメントの重要な部分.to_sql ここでmethod 文字列だけでなく、呼び出し可能にすることもできます。それがあなたが提供するものです

    例:

    from csv import (writer as csv_writer, QUOTE_MINIMAL)
    from io import StringIO
    
    def some_function(df, connection):        
        try:
            frame.to_sql(
                'my_table',
                connection,
                schema='public',
                if_exists='append',
                index=False,
                method=copy_from_method)
        except Exception as err:
            print('Got an error ({})'.format(str(err))
    
    

    次に、copy_from_methodを実装できます。 このようなものとして:

    def copy_from_method(table, conn, keys, data_iter, pre_truncate=False, fatal_failure=False):
        "Custom method for pandas.DataFrame.to_sql that will use COPY FROM"""
    
        dbapi_conn = conn.connection
        cur = dbapi_conn.cursor()
    
        s_buf = StringIO()
        writer = csv_writer(s_buf, quoting=QUOTE_MINIMAL)
        writer.writerows(data_iter)
        s_buf.seek(0)
    
        columns = ', '.join('"{}"'.format(k) for k in keys)
        table_name = '{}.{}'.format(
            table.schema, table.name) if table.schema else table.name
    
        sql_query = 'COPY %s (%s) FROM STDIN WITH CSV' % (table_name, columns)
        cur.copy_expert(sql=sql_query, file=s_buf)
        return cur.rowcount
    

    copy_from_method 明らかにいくつかの作業を使用する可能性があります-場合によっては、CSVライターでの引用とエスケープに注意する必要があります。ただし、この大まかなバージョンは、タイプミスやコピーと貼り付けのエラーがなければ、比較的うまく機能するはずです(これは、プロジェクトで使用する簡略化されたバージョンです)



    1. このLEFTJOINによって返される行数を1つに制限するにはどうすればよいですか?

    2. MySQL専用ロック

    3. MySQL:限られたクエリ結果をシャッフルしますか?

    4. CreateSQLQueryは機能しますが、QueryOverはNHibernateでは機能しません