Peewee - Как выполнить пакетное обновление и как обновить только те строки, которые были отредактированы?

Я пытаюсь выучить Крошку и Бутылку, создавая приложение для заметок для книг.

Модели и отношения состоят из Subject -< Book -< Chapter -< Note.

На странице note.tpl я хочу отобразить все заметки в таблице и разрешить конечному пользователю обновлять любую заметку по своему усмотрению:

<FORM action="/notes" method="POST">
    <input type="hidden" name="chapter_id" value="{{chapter.id}}"
    <% note_ids = ""
       for note in chapter.notes:
           note_ids += note.id
       end
       note_ids = note_ids[:-1]
    %>
    <input type="hidden" name="note_ids" value="{{note_ids}}" />
    <TABLE>
        <TR><TD>Note Meta</TD><TD>Note</TD></TR>
        % for note in chapter.notes:
            <TR><TD>
                Tag:<input type="text" value="note_tag#{{note.id}}" /><br />
                Pg#:<input type="text" value="page_number#{{note.id}}" /><br />
                </TD>
                <TD> <textarea name="note#{{note.id}}" /><br />
            </TR>
        % end
    </TABLE>
</FORM>

Допустим, у меня есть такой контроллер:

@app.route('/notes/, method='POST')
def note_action():
    for i in request.forms.get('note_ids').split(','):
        note = Note(tag=request.forms.get('note_tag#' + i),
        page_number=request.forms.get('page_number#' + i),
        chapter=request.forms.get('chapter_id'))
        note.save()
    chapter = Chapter.select().where(Chapter.id==chapter_id)
    return template('notes', chapter=chapter)

Это плохо по трем причинам:

1) Он не выполняет пакетное обновление, а обновляет каждую заметку по одной. Как мне сделать пакетное обновление в Peewee?

2) Он обновляет каждую заметку, даже заметки, которые не были отредактированы пользователем. Как я могу определить, какие строки были отредактированы, и обновить только эти строки?

Если не использовать JQuery (или использовать его в очень ограниченной степени), как мне решить их?


person Matthew Moisen    schedule 22.03.2014    source источник


Ответы (1)


Что касается вашего первого вопроса, возможно, лучше поздно, чем никогда: API Peewee не имеет метода addBatch(), как в java.sql.Statement JDBC. Вместо этого вы начинаете транзакцию через «с» и выполняете много работы, а Python обрабатывает фиксацию транзакции. Этот пост от автора Peewee иллюстрирует этот подход (к сожалению, ссылка в конце этого поста о массовой загрузке данных не работает):

https://groups.google.com/forum/#!msg/peewee-orm/YWamQxAYxWU/HTu_wUNLHKUJ

person chrisinmtown    schedule 01.03.2015
comment
Peewee имеет возможности массовой вставки, а также выполнять массовые обновления, вы можете создать запрос UPDATE. Если вы хотите пакетировать несколько обновлений или вставок, просто оберните их в транзакцию с помощью диспетчера контекста with db.atomic(). - person coleifer; 02.03.2015
comment
@coleifer: есть ли какая-либо значимая разница между addBatch() в стиле sql и подходом Python/Peewee с db.atomic()? Я не хочу распространять ложную информацию. - person chrisinmtown; 03.03.2015
comment
Я не уверен, что такое addBatch() в стиле sql, поэтому не могу сказать. - person coleifer; 04.03.2015