Изучение затем обновление строк в sqlite с Python - PullRequest
1 голос
/ 13 октября 2010

Я решил, что мне не нравится автоматическая регистрация и переименование, предоставляемые Mendeley , но обнаружил, что он отслеживает все в базе данных sqlite, которую я могу легко прочитать и изменитьPython.

Мой вопрос: если я собираюсь перебирать строки таблицы, содержащие пути к файлам и хэши, которые служат идентификаторами, которые используются в других местах в базе данных, какой шаблон следует использовать?чтобы обновлять пути по мере движения, проверьте, нужно ли переименовывать файл, а затем хотите обновить строку в БД при перемещении файла.

Я начал собирать Python для этого, но этоМне кажется, что мне, вероятно, нужно выполнить запрос заранее, чтобы получить все строки, которые я собираюсь позже перебрать, а затем выполнить операторы REPLACE или UPDATE для файлов, которые я решил переместить.

IЯ не знаком с внутренними компонентами модуля sqlite3, но я предполагаю, что было бы плохой идеей делать REPLACE / UPDATE при выполнении итерациикурсор, используемый для первоначального выбора.

Есть ли другой способ сделать это, который не требует возврата с REPLACE / UPDATEs?Мне нужно выполнять запросы из других таблиц, используя хэш файла для получения других метаданных, чтобы создать переименование.

1 Ответ

2 голосов
/ 11 января 2011

Я не думаю, что есть способ изменить строки в таблице, кроме как через SQL - UPDATE или INSERT OR REPLACE.(Заманчиво подумать, что объект sqlite3.Row может разрешить присваивание, и записать обратно в строку, которую он представляет, но нет.)

Что касается выполнения ОБНОВЛЕНИЙ (через 2-й курсор), в то время как используется выдающийся курсордля оригинального SELECT - вы спрашиваете, является ли это плохой идеей - я не знаю, беспокоитесь ли вы о правильности или производительности (правильность: курсор запутывается и не выполняет итерацию всех строк, которые он должен выполнить ровно один раз;производительность: курсор выполняет итерацию всех строк ровно один раз, но есть куча дорогих дополнительных запросов)?

Корректность WRT, это, кажется, работает нормально - я только что сделал быстрый тест, где я создал двакурсоры c1 и c2, затем на c1 выполнили команду SELECT, затем на c2 выполнили команду UPDATE, влияющую на те же строки, а затем посмотрели на результат c1.fetchall ().Он по-прежнему содержал все правильные строки, хотя данные в первой строке были устаревшими (вероятно, извлечены с помощью исходного запроса), а данные в более поздних строках были обновлены (вероятно, извлечены только с помощью fetchall после обновления).

(Кроме того, если UPDATE на c2 влияет на то, какие записи будут возвращены с помощью SELECT на c1, такие записи больше не будут выбираться, но очевидно, что уже было выбрано все, что было выбрано, и снова курсор.первая запись немедленно, поэтому, используя тот же порядок команд, что и выше, и с командой UPDATE, которая заставит исходный SELECT ничего не найти, более поздняя функция c1.fetchall () по-прежнему возвращает одну запись.)

Что касается производительности,Я не знаю - из предыдущего абзаца мне кажется, что он должен повторить запрос, который может или не может быть дорогим в зависимости от запроса.(Возможно, это не буквальное повторение; возможно, эта работа откладывается до фактического получения в любом случае.)

Короткая история: я не думаю, что есть другой способ сделать это без ОБНОВЛЕНИЯ или ЗАМЕНЫ, и я думаю, что этобудет работать нормально, чтобы сделать эти ОБНОВЛЕНИЯ, даже при выполнении итерации на исходном курсоре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...