我正在開發一個程序,用於自動解析XML文件中的數據並將其存儲到多個數據庫中。 (特別是USGS實時水質服務,如果有人感興趣,請登錄http://waterservices.usgs.gov/rest/WaterML-Interim-REST-Service.html)使用LXML和PYODBC在Python 2.5.1中編寫。該數據庫是在Microsoft Access 2000通過PYODBC的SQL查詢在一臺機器上無聲無息地失敗,在另一臺機器上失敗
連接功能如下:
DEF get_AccessConnection(分貝):
CONNSTRING = 'DRIVER = {Microsoft Access驅動程序(* .mdb)中}; DBQ =' +分貝
cnxn = pyodbc.connect(CONNSTRING,自動提交=假)
光標= cnxn.cursor()
返回cnxn,光標
其中db是文件路徑到數據庫。
程序:
一個)開口於數據庫
b中的連接)解析爲該數據庫2至8的XML文件,並建立從它們的值成一系列的記錄插入到數據庫中(使用嵌套字典結構,而不是一個用戶定義的類型)
c)中循環通過一系列記錄,cursor.execute() - 荷蘭國際集團爲每一個
d SQL查詢)款和關閉數據庫連接
如果cursor.execute()調用會引發錯誤,它會將追溯和查詢寫入日誌文件並繼續前進。
當我的同事在他的機器上運行它時,對於一個特定的數據庫,特定的記錄根本就不存在,沒有記錄錯誤。當我在我的機器上完全相同的網絡路徑上完全相同的數據庫副本上運行完全相同的代碼時,應存在的所有數據都在那裏。
我和我的同事都在裝有Microsoft Access 2000的Windows XP計算機上,並安裝了相同版本的Python,lxml和pyodbc。我不知道如何檢查我們是否具有相同版本的Microsoft ODBC驅動程序。我一直無法找到那裏的記錄和沒有的記錄之間的區別。我正在測試與其他數據庫是否發生同樣的問題,以及它是否發生在第三個同事的計算機上。
我真的很想知道的是任何人都可以想到會導致這種情況,因爲這對我沒有意義。總結一下:執行SQL查詢的Python代碼將在一臺計算機上默默無視一半,並在另一臺計算機上完美工作。
編輯:
沒有更多的問題。我剛剛讓我的同事再次運行它,數據庫完全更新,沒有丟失記錄。仍然不知道爲什麼它首先失敗,也不知道它是否會再次發生,但「問題解決了」。
沒有'autocommit',它有什麼區別嗎? Access不是一個事務數據庫,所以當然'autocommit = False'不能被承認。我用ODBC通過腳本與Access交談的經歷絕對糟糕(掛起等)。你可以嘗試ADO,它至少不那麼糟糕......當然理想的情況是Access需要消失。 – bobince 2010-01-12 17:08:43
我不知道訪問不是事務性的。這當然是表現如此 - 如果我在測試程序時沒有調用cnxn.commit(),則不會更改數據庫。 如果可能,我寧願不改變自動提交。如果出現意外的和未處理的錯誤,我不想要半成品數據庫。 – Rowan 2010-01-12 17:51:34
@Rowan:這是預料之中,Access會等到做出任何事情,直到你讓它提交 - 這樣才能「尊重」交易。 :( - >訪問 – Hogan 2010-01-12 22:27:47