Ho alcuni DataFrames Panda piuttosto grandi e mi piacerebbe utilizzare i nuovi mapping di massa di SQL per caricarli su un Microsoft SQL Server tramite SQL Alchemy. Il metodo pandas.to_sql, sebbene sia bello, è lento.Inserimento di massa Un DataFrame di Pandas Utilizzo di SQLAlchemy
sto avendo problemi a scrivere il codice ...
Mi piacerebbe essere in grado di passare questa funzione un dataframe panda che sto chiamando table
, un nome di schema sto chiamando schema
, e un nome di tabella che sto chiamando name
. Idealmente, la funzione 1.) cancellerà la tabella se già esiste. 2.) creare una nuova tabella 3.) creare un mapper e 4.) inserire bulk utilizzando i dati di mapper e panda. Sono bloccato sulla parte 3.
Ecco il mio codice (ovviamente approssimativo). Sto lottando con come far funzionare la funzione di mapper con le mie chiavi primarie. Non ho davvero bisogno di chiavi primarie ma la funzione mapper lo richiede.
Grazie per gli approfondimenti.
from sqlalchemy import create_engine Table, Column, MetaData
from sqlalchemy.orm import mapper, create_session
from sqlalchemy.ext.declarative import declarative_base
from pandas.io.sql import SQLTable, SQLDatabase
def bulk_upload(table, schema, name):
e = create_engine('mssql+pyodbc://MYDB')
s = create_session(bind=e)
m = MetaData(bind=e,reflect=True,schema=schema)
Base = declarative_base(bind=e,metadata=m)
t = Table(name,m)
m.remove(t)
t.drop(checkfirst=True)
sqld = SQLDatabase(e, schema=schema,meta=m)
sqlt = SQLTable(name, sqld, table).table
sqlt.metadata = m
m.create_all(bind=e,tables=[sqlt])
class MyClass(Base):
return
mapper(MyClass, sqlt)
s.bulk_insert_mappings(MyClass, table.to_dict(orient='records'))
return
Sembra che tu stia ricreando da solo la funzione 'to_sql', e dubito che questo sarà più veloce. Il collo di bottiglia che scrive i dati in SQL si trova principalmente nei driver python ('pyobdc' nel tuo caso), e questo è qualcosa che non puoi evitare con l'implementazione di cui sopra. Inoltre, 'to_sql' non usa l'ORM, che è considerato più lento di CORE sqlalchemy anche quando si utilizza l'inserimento in blocco (http://docs.sqlalchemy.org/en/latest/faq/performance.html # im-inserting-400-000-rows-with-the-orm-and-it-s-really-slow) – joris
Inoltre, se 'to_sql' è troppo lento e non è possibile migliorarlo (ad esempio modificando la connessione i parametri, il driver utilizzato (ad es. pymssql), la velocità di internet, rimuovendo i vincoli sulla tabella, ecc.), un'alternativa più veloce è scrivere i dati in csv e caricarli nella tabella SQL. – joris
@joris Grazie. Sembra che le "operazioni alla rinfusa" elencate qui siano un po 'errate. http://docs.sqlalchemy.org/en/rel_1_0/orm/persistence_techniques.html#bulk-operations Quello che ho davvero bisogno di fare è inviare il file di dati pandas ad un file di testo e scrivere l'operazione BULK INSERT in questo modo ... http: //stackoverflow.com/questions/29638136/how-to-speed-up-with-bulk-insert-to-ms-server-from-python-with-pyodbc-from-csv – Charles