我有74個相對較大的熊貓數據框(大約34,600行和8列),我試圖儘可能快地插入到SQL Server數據庫中。在做了一些研究之後,我瞭解到這個功能對於插入SQL Server數據庫的這種大型數據庫並不好,這是我採用的最初方法(非常慢 - 應用程序完成大約需要一個小時,大約4分鐘。使用MySQL數據庫時)將大熊貓數據框寫入SQL Server數據庫
This article,和許多其他StackOverflow的帖子一直在指着我在正確的方向有幫助的,但是我已經打了一個路障:
我嘗試使用SQLAlchemy的核心,而不是ORM的原因在上面的鏈接中解釋。所以,我的數據幀轉換爲字典,使用pandas.to_dict
,然後做一個和insert()
:
self._session_factory.engine.execute(
TimeSeriesResultValues.__table__.insert(),
data)
# 'data' is a list of dictionaries.
的問題是,插入沒有得到任何價值 - 他們似乎是一堆空括號和我的得到這個錯誤:
(pyodbc.IntegretyError) ('23000', "[23000] [FreeTDS][SQL Server]Cannot
insert the value NULL into the column...
我在傳遞的字典列表中有值,所以我不明白爲什麼值沒有顯示出來。
編輯:
這裏是我要去關的例子:
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")
*約4分鐘,同時使用mysql數據庫* ...這樣的'to_sql()'是一個可行的解決方案時,只是連接MSSQL比MySQL更慢?你正在使用哪種ODBC API?數據庫服務器是本地還是遠程?考慮臨時表導入,然後遷移到最終表。 – Parfait
@Parfait:使用'''to_sql()''可以在MySQL中產生可以接受的性能,但不會產生MSSQL。我正在使用pyodbc。數據庫是遠程的,因此寫入CSV文件然後通過原始的sql代碼進行批量插入在這種情況下也不會真正起作用。此外,用戶需要批量管理權限才能這樣做,這對於此應用程序的用戶來說並不總是可能的。 – denvaar
考慮繞過odbc驅動程序並嚴格使用Python API - [pmyssl](http://www.pymssql.org/en/latest/)和MySQL ODBC API? pymysql?兩者中的表結構和數據類型相同?相同數量的記錄?真的調查這一點。兩者都是高級企業RDMS,不應該執行那麼廣的範圍(4分鐘比~60分鐘)。 – Parfait