sql >> Database >  >> RDS >> PostgreSQL

to_sql + sqlalchemy + kopiëren van + postgresql-engine?

Dit is niet helemaal waar. U kunt dit implementeren om COPY FROM . te gebruiken door uw eigen functie te voorzien voor de kwarg method dat to_sql accepteert. De sleutel in de Pandas-documentatie voor DataFrame .to_sql is waar method kan niet alleen een string zijn, maar ook een callable. Dat is wat je zal bieden

Bijvoorbeeld:

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

Dan zou je copy_from_method . kunnen implementeren als zoiets als dit:

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

Het voorbeeld copy_from_method kan natuurlijk wat werk gebruiken - en in sommige gevallen moet je voorzichtig zijn met citeren en ontsnappen met de CSV-schrijver. Maar deze ruwe versie zou relatief goed moeten werken, met uitzondering van typ-/copy-paste-fouten (dit is een uitgeklede versie die ik in een project gebruik)



  1. Apache, MySQL en PHP containeriseren met Docker

  2. Als ik c9.io gebruik, hoe kan ik dan verbinding maken met MySQL?

  3. Hoe te ontsnappen aan een enkel aanhalingsteken in letterlijke tekenreeksen met MySQL van Java

  4. Detecteren of waarde een getal is in MySQL