sql >> Databáze >  >> RDS >> PostgreSQL

Jak zapsat datový rámec do tabulky Postgres bez použití enginu SQLAlchemy?

Můžete použít tato připojení a vyhnout se SQLAlchemy. Bude to znít poněkud neintuitivně, ale bude to mnohem rychlejší než běžné vkládání (i kdybyste opustili ORM a udělali obecný dotaz, např. pomocí executemany ). Vkládání je pomalé, dokonce i u nezpracovaných dotazů, ale uvidíte, že COPY je několikrát zmíněn v Jak zrychlit výkon vkládání v PostgreSQL . V tomto případě jsou mé motivace pro níže uvedený přístup:

  1. Použijte COPY místo INSERT
  2. Nedůvěřujte Pandám, že vygenerují správné SQL pro tuto operaci (ačkoli, jak poznamenal Ilja Everilä, tento přístup ve skutečnosti dostal přidáno do Pandas ve verzi 0.24 )
  3. Nezapisujte data na disk, abyste vytvořili skutečný souborový objekt; mějte to všechno v paměti

Doporučený přístup pomocí 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()

Mělo by to být řádově rychlejší než skutečné vkládání.




  1. MySQL Query Tuning – Proč je použití hodnoty z proměnné mnohem pomalejší než použití literálu?

  2. Sada problémů 1 – Identifikace entit

  3. Jak spočítat, kolikrát se dvě hodnoty objeví ve dvou sloupcích v libovolném pořadí

  4. Nějaké návrhy na schéma db pro ukládání souvisejících klíčových slov?