2011-09-15 29 views
1

我有一個應用程序需要與另一個應用程序的數據庫進行交互。我有閱讀權限但不能寫。如何使用python有效地與另一個數據庫進行交互

目前我通過pyodbc使用sql語句來抓取行並使用python來操作數據。由於我沒有緩存任何東西,這可能會非常昂貴。

我想用ORM來解決我的問題。問題是如果我使用像「sql鍊金術」這樣的ORM,它是否足夠聰明,可以在其他數據庫中找到變化?

E.g. sql鍊金術訪問一個表並檢索一行。如果該行在sql鍊金術之外被修改了,它會足夠聰明地拿起它嗎?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

編輯:爲了更清晰

我有一個應用程序是一個簡單的報告工具,讓我們稱之爲應用A.

我有一個處理名爲app B.各種金融交易的其他應用程序

一個訪問B的數據庫檢索交易,並生成各種報表。有成千上萬的交易。我們目前正在python中手動緩存這些信息,如果我們需要刷新緩存的更新報告。如果我們擺脫了緩存,那麼與查詢結合的sql查詢將變爲不可縮放的。

+0

究竟是什麼問題?你想達到什麼目的?你想保持數據庫之間的同步數據? – hymloth

+0

這些對象是否有'last_modified'列?你可以利用這個... – plaes

回答

2

我不認爲ORM是解決您的性能問題的方法。默認情況下,ORM往往效率低於行SQL,因爲它們可能會獲取您不打算使用的數據(例如,只需要一個字段時執行SELECT *),儘管SQLAlchemy允許對生成的SQL進行細粒度控制。

現在要實現緩存機制,根據您的應用程序,您可以在內存或專用系統(如memcached或Redis)中使用簡單字典。

爲了讓您的緩存數據保持新鮮度,您可以定期輪詢源代碼,如果您的應用程序可以容忍一點延遲,這可能是確定的。否則,當更新發生時,您需要具有寫入數據庫權限的應用程序來通知應用程序或緩存系統。

編輯:由於您似乎可以控制應用程序B,並且您已經在應用程序A中擁有緩存系統,解決問題的最簡單方法可能是在應用程序A中創建一個應用程序B可以調用的回調過期緩存的項目。這兩款應用程序都需要就約定識別緩存項目達成一致。

+0

感謝您的迴應,我編輯了我的回覆,希望它稍微更清晰。 –

+2

沒有關於數據庫更改通知的神奇方式。重新獲取您訪問的每條記錄(通過SQLAlchemy或其他方式)很可能過於浪費。某些數據庫允許SP和觸發器訪問文件或套接字等東西(Oracle具有DBMS_PIPE,Postgres具有DMBS_PIPE和Listen/Notify,不知道MySQL)。將觸發器添加到發送通知的B數據庫可以解決此問題。 – 9000

相關問題