Как удалить запись в Sqlite

#python #sqlite #flask #jinja2

#python #sqlite #flask #jinja2

Вопрос:

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

Вот шаблон html:

 <ul class=entries>
{% for entry in entries %}
<li><h2>{{ entry.title }}
<h2>{{ entry.text|safe }}</h2>
{% if session.logged_in %}
<a href="{{ url_for('delete_entry') }}">Delete</a>
{% endif %}
{% else %}
{% endfor %}
</ul>
 

Как вы можете видеть, рядом с каждой записью есть ссылка на удаление.Как я должен ссылаться на
правильный идентификатор в базе данных?

Вот функция Python, которая у меня есть до сих пор:

 @app.route('/delete')
def delete_entry():
if not session.get('logged_in'):
    abort(401)
g.db.execute('delete from entries where id=(select max(id)from entries)') 
g.db.commit()
flash('The entry was deleted')
return redirect(url_for('show_entries'))
 

То, что у меня есть до сих пор, работает, но это не то, что я хочу. Заранее спасибо!

Комментарии:

1. Я отредактировал свой ответ, теперь у вас есть полный код, чтобы заставить его работать в Flask

Ответ №1:

Себастьян функция delete_entry удаляет последнюю запись в БД

where id=(select max(id)from entries)

Что вам нужно сделать, это вставить параметр в URL для удаления, например ‘/ delete/:id’, где id — это идентификатор записи, которую вы хотите удалить, затем измените шаблон, чтобы сгенерировать URL таким образом:

 <a href="{{ url_for('delete_entry', entry.id) }}">Delete</a>
 

А также измените запрос БД, который удаляет запись:

 g.db.execute('delete from entries where id='   id)
 

Правка1:

Я проверил документацию Flask, чтобы получить переменные в ваши маршруты, вы должны изменить маршрут следующим образом:

 @app.route('/delete/<int:entry_id>')
 

Таким образом, вы получаете entry_id в вашей функции python:

 def delete_entry(entry_id):
g.db.execute('delete from entries where id='   entry_id)
 

И, наконец, вы должны указать свой идентификатор записи в функции url_for:

 <a href="{{ url_for('delete_entry', entry_id = entry.id) }}">Delete</a>
 

Комментарии:

1. спасибо, что указали мне правильное направление. Я получаю Werkzeug»BuildError: (‘delete_entry, entry.id ‘, {}, Нет), но я собираюсь почитать о Werkzeug подробнее. По крайней мере, теперь я понимаю больше. Я не буду продолжать искать в неправильных местах.

2. виноват, я забыл ввести аргумент в функцию … упс!

3. как получилось так: g.db.execute(‘удалить из записей, где id =’ entry_id) Дает мне следующее: невозможно объединить объекты ‘str’ и ‘int’. Я знаю, что id — это целое число, но почему здесь оно рассматривается как строка? Кстати, почему вы должны объединять идентификатор с entry_id?

4. Я не могу поверить, что все, что мне нужно было сделать, это: entry_id=str(entry_id) g.db.execute(‘удалить из записей, где id=’ entry_id) Самый простой способ преобразовать целое число в строку, и я перепробовал все остальное, кроме этого. Еще раз спасибо @Фернандо!

5. Извините, что я не читал этого до сих пор… что ж, я рад, что ты смог найти свой путь. Поздравляю!