PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

कैसे PostgreSQL तालिका के लिए पांडा DataFrame upsert करने के लिए?

यदि आप 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में एक तिथि में वर्ष जोड़ें

  2. डोकर और डोकर-लिखें में एकाधिक डेटाबेस

  3. डेटाबेस को हटा नहीं सकता

  4. PostgreSQL में कैसे राउंड () काम करता है

  5. मान त्रुटि Psycopg2 का उपयोग कर पोस्टग्रेज तालिका में डेटा आयात करते समय