Запросы SQL через PYODBC молча терпят неудачу на одной машине, работают на другой

Я работаю над программой для автоматизации анализа данных из 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-запросы, молча выдаст ошибку половины из них на одном компьютере и отлично отработает на другом.

Изменить:
Больше никаких проблем. Я только что попросил своего коллегу снова запустить его, и база данных была полностью обновлена ​​без пропущенных записей. До сих пор не знаю, почему это не удалось в первую очередь, и произойдет ли это снова, но «проблема решена».


person Rowan    schedule 12.01.2010    source источник
comment
Есть ли разница без autocommit? Access не является транзакционной базой данных, поэтому autocommit= False нельзя соблюдать. Весь мой опыт общения с Access через сценарии с ODBC был просто ужасным (зависания и т. д.). Вы можете попробовать ADO, который, по крайней мере, менее плох... в идеале, конечно, Access должен уйти.   -  person bobince    schedule 12.01.2010
comment
Я понятия не имел, что Access не является транзакционным. Она определенно ведет себя так: если бы я не вызывал cnxn.commit() во время тестирования программы, никакие изменения в базах данных не сохранялись бы. Я бы предпочел не менять автокоммит, если это возможно. Мне не нужны недоработанные базы данных, если возникает непредвиденная и необработанная ошибка.   -  person Rowan    schedule 12.01.2010
comment
@Rowan: Это ожидаемо, Access ждет, чтобы сделать что-нибудь, пока вы не скажете ему зафиксировать - таким образом он соблюдает транзакцию. :( -> Доступ   -  person Hogan    schedule 13.01.2010
comment
@bobince re: Access не является транзакционной базой данных, поэтому, конечно, autocommit=False не может соблюдаться. - Абсолютная чепуха.   -  person Gord Thompson    schedule 25.07.2017


Ответы (1)


Я понятия не имею, как проверить, есть ли у нас одинаковая версия драйверов Microsoft ODBC.

Я думаю, вы ищете Панель управления | Административные инструменты | Источники данных (ODBC). Перейдите на вкладку «Драйверы».

Я думаю, что либо Access 2000, либо Office 2000 поставлялись с настольной версией SQL Server под названием «MSDE». Может быть стоит установить это для тестирования. (Или производство, если уж на то пошло.)

person Mike Sherrill 'Cat Recall'    schedule 26.01.2011