Mam 74 stosunkowo duże Pandy DataFrames (około 34 600 wierszy i 8 kolumn), które próbuję wstawić do bazy danych SQL Server tak szybko, jak to możliwe. Po zrobieniu pewnych badań nauczyłem się, że dobra funkcja ole pandas.to_sql
nie jest dobra dla takich dużych wstawek do bazy danych SQL Server, co było początkowym podejściem, które podjąłem (bardzo wolno - prawie godzina, aby aplikacja zakończyła się w około 4 minuty . podczas korzystania z bazy danych mySQL)Napisz duże pandy DataFrames do bazy danych SQL Server
This article i wiele innych stanowisk StackOverflow były pomocne w wskazujące mnie we właściwym kierunku, jednak mam uderzyć blokadę:
próbuję użyć sqlalchemy Core zamiast ORM z powodów wyjaśnionych w powyższym linku. Tak, jestem przekształcając dataframe do słownika, a następnie za pomocą pandas.to_dict
robi execute()
i insert()
:
self._session_factory.engine.execute(
TimeSeriesResultValues.__table__.insert(),
data)
# 'data' is a list of dictionaries.
Problem polega na tym, że wkładka nie dostaje żadnych wartości - pojawiają się one jako pęczek pustego nawiasu i I dostać ten błąd:
(pyodbc.IntegretyError) ('23000', "[23000] [FreeTDS][SQL Server]Cannot
insert the value NULL into the column...
Istnieją wartości na liście słowników że minąłem się, więc nie mogę zrozumieć, dlaczego wartości nie są wyświetlane.
EDIT:
Oto przykład idę off:
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")
* około 4 minut przy użyciu bazy danych MySQL * ... tak więc 'to_sql()' jest dobrym rozwiązaniem tylko połączenie jest wolniej w MSSQL w porównaniu do MySQL? Z jakiego interfejsu API ODBC korzystasz? Czy serwer bazy danych jest lokalny czy zdalny? Rozważ importowanie tabel tymczasowych, a następnie zmigruj do tabeli końcowej. – Parfait
@Parfait: Użycie '' 'to_sql()' '' daje akceptowalną wydajność z MySQL, ale nie MSSQL. Używam pyodbc. Baza danych jest zdalna, więc pisanie do plików CSV, a następnie robienie wstawienia zbiorczego przez surowy kod SQL nie będzie działało w tej sytuacji. Ponadto użytkownicy potrzebowaliby uprawnień do masowego administrowania, aby to zrobić, co nie zawsze może być możliwe dla użytkowników tej aplikacji. – denvaar
Zastanów się, czy pominąć sterownik ODBC i używać ściśle Pythona API - [pmyssl] (http://www.pymssql.org/en/latest/) A API MySQL ODBC? pymysql? Ta sama struktura tabel i typy danych w obu? Ta sama liczba rekordów? Naprawdę to zbadaj. Oba są RDMS wysokiego poziomu przedsiębiorstwa i nie powinny wykonywać tak szeroki zakres (4 min vs. ~ 60 min). – Parfait