Форум сайта python.su
Есть база данных, нужно для каждой строчки сделать запрос на удаленный сервер, получить и обработать нужную информацию, и сохранить полученные данные в эту строку. Я делаю так:
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)
Отредактировано Elka (Апрель 25, 2012 16:34:32)
Офлайн
что-то логика не совсем ясна. хорошо бы поподробнее ее описать.
Офлайн
ElkaА где у вас удаленный сервер-то?
сделать запрос на удаленный сервер
Отредактировано regall (Апрель 25, 2012 21:29:17)
Офлайн
Ок, хорошо. Задача не по работе, а по учебе.
Есть база данных белков, у каждого белка есть свой ид. По этому ид я с другого сервера запрашиваю xml, где получаю данные о том, какому организму принадлежит этот белок (ну и еще кое-какие данные). Мне эти данные нужно сохранить в свою базу данных.
мне уже сказали, что я во втором случае не правильную команду отдаю, нужно не INSERT, а UPDATE
UPDATE proteins SET kingdom=organism_kingdom WHERE sequense_ID=id
Но видимо я опять делаю что-то не то, т.к. все равно этот скрипт не работает
Офлайн
Еще точнее код теперь выглядит так:
cu.execute("UPDATE proteins SET kingdom=?, organism_ID=? WHERE sequence_ID=?", (kingdom, id_organism, sequence_ID))
Офлайн
>он зависает
может быть записей ОЧЕНЬ-ОЧЕНЬ много/огромная база и нет индекса для sequence_ID? (хотя судя по запросу, уникальный индекс таки должен присутствовать для этого поля)
если выполнить этот же UPDATE вручную (из утилиты администрирования или из консоли) - что происходит?
Отредактировано beelze (Апрель 26, 2012 12:40:26)
Офлайн
Ой, спасибо за ответ. Проверила. Проблема все-таки в размере бд, запрос правильный (sequence_ID существует)
может быть записей ОЧЕНЬ-ОЧЕНЬ много/огромная базаНу-у.. 11 миллионов белков, сколько биологи нарасшифровывали
Офлайн
11 миллионов это не особо много. Так есть ли индекс для sequence_ID? И где собственно sqlite база расположена? если на удаленном хосте - то это неправильный выбор СУБД; в худшем случае весь Ваш мегафайл будет на каждую транзакцию гоняться по сети туда-обратно. Думаю, что Вам придется или использовать что-то отсюда: http://sqlite.org/cvstrac/wiki?p=SqliteNetwork или перейти на клиент-серверную СУБД.
Офлайн
Да, индекс для sequence_ID есть. База расположена на моем домашнем компе.
Да, база не очень большая, проблема в компе - он слабенький.
Думаю, что Вам придется или использовать что-то отсюда: http://sqlite.org/cvstrac/wiki?p=SqliteNetwork или перейти на клиент-серверную СУБД.
Офлайн
Elka, сетевой слой или клиент/серверная архитектура нужна Вам только если база с клиентским слоем по сети взаимодействуют. Чтобы увеличить быстродействие в случае если у Вас много UPDATE - оберните их в одну транзакцию - это даст радикальный эффект.
Офлайн