Bir SQL Server veritabanına mümkün olduğunca çabuk girmeye çalıştığım 74 nispeten büyük Pandas DataFrames (Yaklaşık 34.600 satır ve 8 sütun) var. Bazı araştırmalar yaptıktan sonra, iyi bir ole pandas.to_sql
işlevinin, SQL Server veritabanına bu kadar büyük ekler için iyi olmadığını öğrendim. Bu, benim aldığım ilk yaklaşımdı (çok yavaş - yaklaşık 4 dakikalık bir uygulama için yaklaşık bir saat tamamlandı) .SQL Server veritabanına Büyük Pandalar DataFrames yazın
ben yerine sqlalchemy en Core'u kullanmaya çalışıyorum: mySQL veritabanını kullanırken)
This article ve diğer birçok StackOverflow mesajları ancak bir barikat vurdum bana doğru yönde işaret yardımcı olmuştur Yukarıdaki bağlantıda açıklanan nedenlerden dolayı ORM. Yani, pandas.to_dict
kullanarak bir sözlüğe dataframe dönüştürme ediyorum ve daha sonra bir execute()
ve insert()
yapıyor: O insert edilir
self._session_factory.engine.execute(
TimeSeriesResultValues.__table__.insert(),
data)
# 'data' is a list of dictionaries.
sorun herhangi bir değer almıyor - bunlar boş parantez ve ben bir grup olarak görünür
(pyodbc.IntegretyError) ('23000', "[23000] [FreeTDS][SQL Server]Cannot
insert the value NULL into the column...
Ben geçirilen sözlüklerde listesinde değerleri vardır, bu nedenle değerler görünmüyor neden çözemiyorum: Bu hatayı olsun.
DÜZENLEME:
Burada kapalı gidiyorum örnek: Eğer SQLAlchemy aslında SQL Server için toplu alma uygulamıyor için bazı üzücü haberlerim var
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")
sadece bağlantı yaklaşık 4 dakikadır *: İşte daha önce kullandığınız bir komut dosyası, ancak hiçbir garanti değildir MSSQL'de MySQL'e göre daha mı yavaş? Hangi ODBC API kullanıyorsunuz? Veritabanı sunucusu yerel mi yoksa uzak mı? Geçici tablo içe aktarmayı göz önünde bulundurun ve ardından son tabloya geçin. – Parfait
@Parfait: '' 'to_sql() işlevinin kullanılması, MySQL ile kabul edilebilir bir performans sağlar, ancak MSSQL ile değil. Pyodbc kullanıyorum. Veritabanı uzaktadır, bu nedenle CSV dosyalarına yazı yazmak ve daha sonra ham sql kodu ile toplu bir ekleme yapmak gerçekten bu durumda çalışmayacaktır. Ek olarak, kullanıcılar bunu yapmak için toplu yönetim ayrıcalıklarına ihtiyaç duyarlar. Bu, bu uygulamanın kullanıcıları için her zaman mümkün olmayabilir. – denvaar
Odbc sürücüsünü atlayarak ve kesinlikle Python API'sini kullanın - [pmyssl] (http://www.pymssql.org/en/latest/) Ve MySQL ODBC API'sı? pymysql? Her ikisinde de aynı tablo yapısı ve veri tipleri var mı? Aynı sayıda kayıt var mı? Bunu gerçekten araştırın. Her ikisi de yüksek seviyeli kurumsal RDMS'lerdir ve geniş bir aralıkta olmamalıdır (4 dakika vs ~ 60 dakika). – Parfait