Найти - Пользователи
Полная версия: Как правильно построчно записать данные в базу данных?
Начало » Базы данных » Как правильно построчно записать данные в базу данных?
1 2
Elka
Есть база данных, нужно для каждой строчки сделать запрос на удаленный сервер, получить и обработать нужную информацию, и сохранить полученные данные в эту строку. Я делаю так:

import sqlite3
def get_next_data(cu): {
     row = cu.fetchone()
     if row != None:
         data = get_data(row)
         cu.execute("INSERT INTO my_table (data1, data2) VALUES (?,?)", (data[0], data[1]))
         get_next_data(cu)
}
base = db.connect(database="my_db")
cu = base.cursor()
cu.execute("SELECT sequence_ID FROM my_table")
get_next_data(cu)

База данных относительно тяжелая (1.5 Гб), работаю на своем компе, поэтому стараюсь оперативку не сильно загружать. data = get_data(row) - требует времени (скачивает xml-ку), поэтому пройтись циклом по всем строкам не получится.


Опыт с базами данных - почти нулевой, поэтому наверное мои вопросы глупые. Но просто в доках я не нашла, как решить мою задачу.
beelze
что-то логика не совсем ясна. хорошо бы поподробнее ее описать.
regall
Elka
сделать запрос на удаленный сервер
А где у вас удаленный сервер-то?
Sqlite не клиент-серверная БД, это просто библиотечка, разве что у вас БД по самбе расшарена ;)

А так, согласен beelze, суть задачи желательно поподробнее раскрыть и как-то понятнее, что ли…
Elka
Ок, хорошо. Задача не по работе, а по учебе.

Есть база данных белков, у каждого белка есть свой ид. По этому ид я с другого сервера запрашиваю xml, где получаю данные о том, какому организму принадлежит этот белок (ну и еще кое-какие данные). Мне эти данные нужно сохранить в свою базу данных.

мне уже сказали, что я во втором случае не правильную команду отдаю, нужно не INSERT, а UPDATE

UPDATE proteins SET kingdom=organism_kingdom WHERE sequense_ID=id

Но видимо я опять делаю что-то не то, т.к. все равно этот скрипт не работает
Elka
Еще точнее код теперь выглядит так:

cu.execute("UPDATE proteins SET kingdom=?, organism_ID=? WHERE sequence_ID=?", 
			(kingdom, id_organism, sequence_ID))

Проблема в том, что весь остальной код из скрипта выполняется, а когда доходит до этой строчки он зависает.

Видимо происходит блокировка? Но как это убрать? Я попробовала менять isolation_level, но ничего не изменилось.
beelze
>он зависает
может быть записей ОЧЕНЬ-ОЧЕНЬ много/огромная база и нет индекса для sequence_ID? (хотя судя по запросу, уникальный индекс таки должен присутствовать для этого поля)

если выполнить этот же UPDATE вручную (из утилиты администрирования или из консоли) - что происходит?
Elka
Ой, спасибо за ответ. Проверила. Проблема все-таки в размере бд, запрос правильный (sequence_ID существует)

может быть записей ОЧЕНЬ-ОЧЕНЬ много/огромная база
Ну-у.. 11 миллионов белков, сколько биологи нарасшифровывали


Тогда вопрос. Получается, мне ничего не остается, кроме как, искать более мощную удаленную машину, или можно все-таки переписать код так, чтобы он работал за вменяемое время? В конце концов, т.к. я пробегаю бд построчно, я всегда знаю, какую именно строку нужно изменять.
beelze
11 миллионов это не особо много. Так есть ли индекс для sequence_ID? И где собственно sqlite база расположена? если на удаленном хосте - то это неправильный выбор СУБД; в худшем случае весь Ваш мегафайл будет на каждую транзакцию гоняться по сети туда-обратно. Думаю, что Вам придется или использовать что-то отсюда: http://sqlite.org/cvstrac/wiki?p=SqliteNetwork или перейти на клиент-серверную СУБД.
Elka
Да, индекс для sequence_ID есть. База расположена на моем домашнем компе.

Да, база не очень большая, проблема в компе - он слабенький.

Думаю, что Вам придется или использовать что-то отсюда: http://sqlite.org/cvstrac/wiki?p=SqliteNetwork или перейти на клиент-серверную СУБД.

Ок, спасибо, пойду читать.
beelze
Elka, сетевой слой или клиент/серверная архитектура нужна Вам только если база с клиентским слоем по сети взаимодействуют. Чтобы увеличить быстродействие в случае если у Вас много UPDATE - оберните их в одну транзакцию - это даст радикальный эффект.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB