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

to_sql + sqlalchemy + kopie z + postgresql engine?

To není tak docela pravda. Můžete to implementovat pomocí COPY FROM poskytnutím vlastní funkce pro method kwarg že to_sql přijímá. Klíčový bit v dokumentaci Pandas pro DataFrame .to_sql je kde method může být nejen řetězec, ale také volatelný. To je to, co poskytnete

Například:

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

Pak byste mohli implementovat copy_from_method jako něco takového:

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

Příklad copy_from_method by se samozřejmě mohla hodit nějaká práce – a v některých případech budete muset být opatrní s citacemi a escapováním s autorem CSV. Ale tato hrubá verze by měla fungovat relativně dobře, s vyloučením jakýchkoli překlepů/chyb při kopírování a vkládání (toto je zkrácená verze, kterou používám v projektu)



  1. index dataframe.to_sql jako primární klíč v postgresql

  2. Lze z uzamčeného řádku [v Postgresu] stále číst?

  3. První dva platy v každém oddělení

  4. Existuje způsob, jak učinit celý řádek MySQL jedinečným