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

to_sql + sqlalchemy + kopia z + silnik postgresql?

To nie do końca prawda. Możesz to zaimplementować, aby użyć COPY FROM dostarczając własną funkcję dla method kwarg ten to_sql akceptuje. Kluczowy bit w dokumentacji Pand dla DataFrame .to_sql jest tam, gdzie method może być nie tylko ciągiem, ale także wywoływać. To właśnie zapewnisz

Na przykład:

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))

Następnie możesz zaimplementować copy_from_method jako coś takiego:

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

Przykład copy_from_method przydałoby się oczywiście trochę pracy - aw niektórych przypadkach będziesz musiał być ostrożny z cytowaniem i ucieczką z pisarzem CSV. Ale ta wstępna wersja powinna działać stosunkowo dobrze, z wyjątkiem błędów literówek/kopiowania wklejania (jest to uproszczona wersja, której używam w projekcie)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqlalchemy, filtruje kolumnę json zawierającą tablicę

  2. Wyzwalacz Postgres po uzyskaniu dostępu do insertu NOWOŚĆ

  3. Rails Migrations:próbowano zmienić typ kolumny z ciągu na liczbę całkowitą

  4. Jak utworzyć ograniczenie wykluczania z zakresem dat za pomocą sqlalchemy?

  5. Agregacja połączonych zbiorów węzłów/krawędzi