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

pandas DataFrameをPostgreSQLテーブルにアップサートする方法は?

    PostgreSQL 9.5以降を使用している場合は、一時テーブルとINSERT ... ON CONFLICTを使用してUPSERTを実行できます。 ステートメント:

    import sqlalchemy as sa
    
    # …
    
    with engine.begin() as conn:
        # step 0.0 - create test environment
        conn.execute(sa.text("DROP TABLE IF EXISTS main_table"))
        conn.execute(
            sa.text(
                "CREATE TABLE main_table (id int primary key, txt varchar(50))"
            )
        )
        conn.execute(
            sa.text(
                "INSERT INTO main_table (id, txt) VALUES (1, 'row 1 old text')"
            )
        )
        # step 0.1 - create DataFrame to UPSERT
        df = pd.DataFrame(
            [(2, "new row 2 text"), (1, "row 1 new text")], columns=["id", "txt"]
        )
        
        # step 1 - create temporary table and upload DataFrame
        conn.execute(
            sa.text(
                "CREATE TEMPORARY TABLE temp_table (id int primary key, txt varchar(50))"
            )
        )
        df.to_sql("temp_table", conn, index=False, if_exists="append")
    
        # step 2 - merge temp_table into main_table
        conn.execute(
            sa.text("""\
                INSERT INTO main_table (id, txt) 
                SELECT id, txt FROM temp_table
                ON CONFLICT (id) DO
                    UPDATE SET txt = EXCLUDED.txt
                """
            )
        )
    
        # step 3 - confirm results
        result = conn.execute(sa.text("SELECT * FROM main_table ORDER BY id")).fetchall()
        print(result)  # [(1, 'row 1 new text'), (2, 'new row 2 text')]
    


    1. Moodleデータベースのスケールアウト

    2. SQLで数値を最も近い整数に切り上げる方法

    3. 単一のクエリ(再帰クエリ)でmysqlテーブル内のすべての親を検索する

    4. Dockerはpostgresqlが実行されるのを待ちます