Ho 74 DataFrames Pandas relativamente grandi (circa 34.600 righe e 8 colonne) che sto cercando di inserire in un database SQL Server il più rapidamente possibile. Dopo aver fatto qualche ricerca, ho appreso che la buona funzione pandas.to_sql
non è buona per inserti così grandi in un database SQL Server, che era l'approccio iniziale che ho preso (molto lento - quasi un'ora per completare l'applicazione vs circa 4 minuti . quando si utilizzano database mysql)Write Large Pandas DataFrames su database SQL Server
This article, e molti altri posti StackOverflow sono stati utili a me che punta nella direzione giusta, ma ho colpito un posto di blocco:
sto cercando di utilizzare core SQLAlchemy piuttosto che il ORM per ragioni spiegate nel link sopra. Quindi, io sono la conversione del dataframe ad un dizionario, usando pandas.to_dict
e poi facendo un execute()
e insert()
:
self._session_factory.engine.execute(
TimeSeriesResultValues.__table__.insert(),
data)
# 'data' is a list of dictionaries.
Il problema è che inserto non sta ottenendo alcun valore - appaiono come una serie di parentesi vuota e io ottenere questo errore:
(pyodbc.IntegretyError) ('23000', "[23000] [FreeTDS][SQL Server]Cannot
insert the value NULL into the column...
ci sono valori nella lista dei dizionari che ho passato in, quindi non riesco a capire il motivo per cui i valori non vengono visualizzati.
EDIT:
Ecco l'esempio che sto andando fuori di:
def test_sqlalchemy_core(n=100000):
init_sqlalchemy()
t0 = time.time()
engine.execute(
Customer.__table__.insert(),
[{"name": 'NAME ' + str(i)} for i in range(n)]
)
print("SQLAlchemy Core: Total time for " + str(n) +
" records " + str(time.time() - t0) + " secs")
* circa 4 minuti quando si utilizza database MySQL * ... in modo che il 'to_sql()' è una soluzione praticabile solo la connessione è più lento in MSSQL rispetto a MySQL? Quale API ODBC stai usando? Il server di database è locale o remoto? Prendi in considerazione l'importazione di una tabella temporanea e poi esegui la migrazione al tavolo finale. – Parfait
@Parfait: l'utilizzo di '' 'to_sql()' '' produce prestazioni accettabili con MySQL, ma non con MSSQL. Sto usando pyodbc. Il database è remoto, quindi scrivere in file CSV e quindi fare un inserimento di massa tramite codice SQL non funzionerà in questa situazione. Inoltre, gli utenti necessitano di privilegi di amministrazione di massa, il che potrebbe non essere sempre possibile per gli utenti di questa applicazione. – denvaar
Considerare di bypassare il driver odbc e utilizzare un'API Python rigorosa - [pmyssl] (http://www.pymssql.org/en/latest/) E l'API ODBC MySQL? pymysql? Stessa struttura tabella e tipi di dati in entrambi? Stesso numero di record? Veramente indagare su questo. Entrambi sono RDMS aziendali di alto livello e non devono eseguire un intervallo di questo intervallo (4 minuti contro ~ 60 minuti). – Parfait