Избегание MaxLocksPerFile через подключение ODBC к MS Access - PullRequest
0 голосов
/ 07 декабря 2009

Из-за «не зависящих от меня обстоятельств» tm я использую sqlalchemy с бэкэндом MS Access. У меня возникла проблема, что следующий код:

def delete_imports(self, files_imported_uid):
    table_name = 'my_table'
    delete_raw = self.meta.tables[table_name].delete()
    self.engine.execute(delete_raw.where(
        self.meta.tables[table_name].c.files_imported_uid == files_imported_uid)
        )

выдает «Превышено число блокировок при обмене файлами». ошибка с большими таблицами. Сгенерированный оператор просто:

DELETE FROM my_table WHERE my_table.files_imported_uid = ?

с параметром идентификатора пользователя. Затем оператор выполняется через pyodbc. MSDN предоставил несколько предложений, чтобы обойти эту проблему, прежде чем сообщить мне, что они не будут работать, если база данных находится на сервере Novell NetWare, что и есть.

Есть ли известная работа, которую я могу использовать (желательно на уровне sqlalchemy), или мне нужно создать некрасивый хак, который выбирает первые 9 000 записей за раз для удаления и зацикливается до завершения?

Ответы [ 2 ]

1 голос
/ 11 декабря 2009

Посмотрев на это, sqlalchemy не может поддерживать 'Top' при удалении (исключая простой вариант упорядочения и удаления первых 9000 каждый раз до завершения всего удаления), поэтому я сдался и просто удалил каждую строку по отдельности. Не идеально, но с учетом того, что:

1) Эта операция выполняется только один раз в месяц
2) Все равно довольно быстро удаляются
3) Я основной пользователь приложения ...

Казалось, не стоит кодировать более эффективную работу.

0 голосов
/ 07 декабря 2009

PRB: ошибка «3050 Не удалось заблокировать файл» при подключении к базе данных Jet на сервере Novell

Теперь для варианта 1 требуется доступ администратора к HKLM. Вариант 2 относится к конкретному Access, и я понятия не имею, будут ли они работать в sqlalchemy.

...