Я работаю над программой для автоматизации анализа данных из XML-файлов и их хранения в нескольких базах данных. (В частности, служба качества воды Геологической службы США в режиме реального времени, если кому-то интересно, на http://waterservices.usgs.gov/rest/WaterML-Interim-REST-Service.html) Он написан на Python 2.5.1 с использованием LXML и PYODBC. Базы данных находятся в Microsoft Access 2000.
Функция подключения выглядит следующим образом:
def get_AccessConnection(db):
connString = 'DRIVER={Драйвер Microsoft Access (*.mdb)};DBQ=' + db
cnxn = pyodbc.connect(connString , autocommit=False)
cursor = cnxn.cursor()
return cnxn, cursor
где db — это путь к файлу базы данных.
Программа:
а) открывает соединение с базой данных
б) анализирует от 2 до 8 файлов XML для этой базы данных и создает из них значения в серию записей для вставки в базу данных (используя вложенную структуру словаря). , а не определяемый пользователем тип)
c) циклически перебирает серию записей, cursor.execute() - отправляет SQL-запрос для каждой из них
d) фиксирует и закрывает соединение с базой данных
Если вызов cursor.execute() выдает ошибку, он записывает трассировку и запрос в файл журнала и движется дальше.
Когда мой коллега запускает его на своей машине, для одной конкретной базы данных конкретных записей просто не будет, и ошибок не будет. Когда я запускаю точно такой же код в той же самой копии базы данных по тому же самому сетевому пути с моей машины, все данные, которые должны быть там, есть.
Мы с коллегой работаем на компьютерах с Windows XP, Microsoft Access 2000 и одинаковыми установленными версиями Python, lxml и pyodbc. Я понятия не имею, как проверить, есть ли у нас одинаковая версия драйверов Microsoft ODBC. Я не смог найти никакой разницы между записями, которые есть, и записями, которых нет. Я сейчас проверяю, возникает ли такая же проблема с другими базами данных, а также возникает ли она на компьютере третьего сотрудника.
То, что я действительно хотел бы знать, это ЧТО-НИБУДЬ, о чем кто-либо может думать, что могло бы вызвать это, потому что это не имеет смысла для меня. Подводя итог: код Python, выполняющий SQL-запросы, молча выдаст ошибку половины из них на одном компьютере и отлично отработает на другом.
Изменить:
Больше никаких проблем. Я только что попросил своего коллегу снова запустить его, и база данных была полностью обновлена без пропущенных записей. До сих пор не знаю, почему это не удалось в первую очередь, и произойдет ли это снова, но «проблема решена».
autocommit
? Access не является транзакционной базой данных, поэтомуautocommit= False
нельзя соблюдать. Весь мой опыт общения с Access через сценарии с ODBC был просто ужасным (зависания и т. д.). Вы можете попробовать ADO, который, по крайней мере, менее плох... в идеале, конечно, Access должен уйти. - person bobince   schedule 12.01.2010