Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 25, 2012 16:33:44

Elka
Зарегистрирован: 2012-04-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно построчно записать данные в базу данных?

Есть база данных, нужно для каждой строчки сделать запрос на удаленный сервер, получить и обработать нужную информацию, и сохранить полученные данные в эту строку. Я делаю так:

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-ку), поэтому пройтись циклом по всем строкам не получится.


Опыт с базами данных - почти нулевой, поэтому наверное мои вопросы глупые. Но просто в доках я не нашла, как решить мою задачу.

Отредактировано Elka (Апрель 25, 2012 16:34:32)

Офлайн

#2 Апрель 25, 2012 20:40:22

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Как правильно построчно записать данные в базу данных?

что-то логика не совсем ясна. хорошо бы поподробнее ее описать.

Офлайн

#3 Апрель 25, 2012 21:28:30

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Как правильно построчно записать данные в базу данных?

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

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



Отредактировано regall (Апрель 25, 2012 21:29:17)

Офлайн

#4 Апрель 25, 2012 22:40:22

Elka
Зарегистрирован: 2012-04-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно построчно записать данные в базу данных?

Ок, хорошо. Задача не по работе, а по учебе.

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

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

UPDATE proteins SET kingdom=organism_kingdom WHERE sequense_ID=id

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

Офлайн

#5 Апрель 26, 2012 00:48:37

Elka
Зарегистрирован: 2012-04-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно построчно записать данные в базу данных?

Еще точнее код теперь выглядит так:

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

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

Видимо происходит блокировка? Но как это убрать? Я попробовала менять isolation_level, но ничего не изменилось.

Офлайн

#6 Апрель 26, 2012 12:38:22

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Как правильно построчно записать данные в базу данных?

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

если выполнить этот же UPDATE вручную (из утилиты администрирования или из консоли) - что происходит?

Отредактировано beelze (Апрель 26, 2012 12:40:26)

Офлайн

#7 Апрель 26, 2012 13:02:42

Elka
Зарегистрирован: 2012-04-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно построчно записать данные в базу данных?

Ой, спасибо за ответ. Проверила. Проблема все-таки в размере бд, запрос правильный (sequence_ID существует)

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


Тогда вопрос. Получается, мне ничего не остается, кроме как, искать более мощную удаленную машину, или можно все-таки переписать код так, чтобы он работал за вменяемое время? В конце концов, т.к. я пробегаю бд построчно, я всегда знаю, какую именно строку нужно изменять.

Офлайн

#8 Апрель 26, 2012 13:25:42

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Как правильно построчно записать данные в базу данных?

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

Офлайн

#9 Апрель 26, 2012 13:34:16

Elka
Зарегистрирован: 2012-04-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно построчно записать данные в базу данных?

Да, индекс для sequence_ID есть. База расположена на моем домашнем компе.

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

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

Ок, спасибо, пойду читать.

Офлайн

#10 Апрель 26, 2012 14:15:42

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Как правильно построчно записать данные в базу данных?

Elka, сетевой слой или клиент/серверная архитектура нужна Вам только если база с клиентским слоем по сети взаимодействуют. Чтобы увеличить быстродействие в случае если у Вас много UPDATE - оберните их в одну транзакцию - это даст радикальный эффект.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version