PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zapisać ramkę danych do tabeli Postgres bez użycia silnika SQLAlchemy?

Możesz użyć tych połączeń i uniknąć SQLAlchemy. Zabrzmi to raczej nieintuicyjnie, ale będzie znacznie szybsze niż zwykłe wstawianie (nawet jeśli usuniesz ORM i wykonasz ogólne zapytanie, np. za pomocą executemany ). Wstawianie jest powolne, nawet w przypadku nieprzetworzonych zapytań, ale zobaczysz, że COPY jest kilkakrotnie wspominany w Jak przyspieszyć wydajność wstawiania w PostgreSQL . W tym przypadku moje motywacje dla poniższego podejścia są następujące:

  1. Użyj COPY zamiast INSERT
  2. Nie ufaj Pandom, że wygenerują poprawny kod SQL dla tej operacji (chociaż, jak zauważyła Ilja Everilä, to podejście faktycznie uzyskało dodane do Pand w wersji 0.24 )
  3. Nie zapisuj danych na dysk, aby utworzyć rzeczywisty obiekt pliku; zachowaj to wszystko w pamięci

Sugerowane podejście przy użyciu 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()

Powinno to być o rzędy wielkości szybsze niż faktyczne wykonywanie wstawek.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aktualizacja SQL pól jednej tabeli z pól innej

  2. przekonwertować typ danych MySQL SET na Postgres

  3. dlaczego pisze w tabeli zapobiega próżni w innym?

  4. Funkcje Postgresa

  5. Połączenie odrzucone (PGError) (postgresql i rails)