DevGang
Авторизоваться

FlaskSQLAlchemy

Расширение для поддержки SQLAlchemy в Flask

Теперь, когда вы объявили модели, пришло время запрашивать данные из базы данных. Мы будем использовать определения моделей из главы «Быстрый старт».

Вставка записей

Прежде чем мы сможем что-то запросить, нам нужно будет вставить некоторые данные. Все ваши модели должны иметь конструктор, поэтому обязательно добавьте его, если вы забыли. Конструкторы используются только вами, а не SQLAlchemy, так что вы сами можете их определять.

Вставка данных в базу данных состоит из трех этапов:

  • Создайте Python объект
  • Добавьте его в session
  • Зафиксируйте session

Session здесь это не Flask session, а session Flask-SQLAlchemy. По сути, это улучшенная версия транзакции базы данных. Вот как это работает:

from yourapp import User
me = User('admin', 'admin@example.com')
db.session.add(me)
db.session.commit()

Хорошо, это было не сложно. Что происходит и в какой момент? Прежде чем добавить объект в session, SQLAlchemy в основном не планирует добавлять его в транзакцию. Это хорошо, потому что вы все еще можете отказаться от изменений. Например, подумайте о создании поста на странице, но вы хотите передать пост только шаблону для предварительного просмотра, а не сохранять его в базе данных.

Вызов функции session.add() добавляет объект. Он выдаст инструкцию INSERT для базы данных, но, поскольку транзакция все еще не зафиксирована, вы не получите идентификатор немедленно. Если вы сделаете коммит, у вашего пользователя будет идентификатор:

me.id
# 1

Удаление записей

Удаление записей очень похоже, вместо session.add() используйте session.delete():

db.session.delete(me)
db.session.commit()

Запрос записей

Так как же нам вернуть данные из нашей базы данных? Для этого Flask-SQLAlchemy предоставляет атрибут query для вашего класса Model. При обращении к нему вы получите новый объект query по всем записям. Затем вы можете использовать такие методы, как query.filter(), чтобы отфильтровать записи, прежде чем запускать select с all() или first(). Если вы хотите перейти по первичному ключу, вы также можете использовать get().

Следующие запросы предполагают следующие записи в базе данных:

+----+----------+-------------------+
| id | username | email             |
+----+----------+-------------------+
| 1  | admin    | admin@example.com |
| 2  | peter    | peter@example.org |
| 3  | guest    | guest@example.com |
+----+----------+-------------------+

Получить пользователя по имени:

peter = User.query.filter_by(username='peter').first()
peter.id
# 2
peter.email
# u'peter@example.org'

То же, что и выше, но для несуществующего имени пользователя выдается None:

missing = User.query.filter_by(username='missing').first()
missing is None
# True

Выбор группы пользователей по более сложному выражению:

User.query.filter(User.email.endswith('@example.com')).all()
# [<User u'admin'>, <User u'guest'>]

Сортировка пользователей пользователей:

User.query.order_by(User.username).all()
# [<User u'admin'>, <User u'guest'>, <User u'peter'>]

Ограничение количества записей:

User.query.limit(1).all()
# [<User u'admin'>]

Получение пользователя по первичному ключу:

User.query.get(1)
# <User u'admin'>

Запросы в Views

Если вы пишете view функцию Flask, часто очень удобно возвращать ошибку 404 для несуществующих или ненайденных записей. Поскольку это очень распространенная идиома, Flask-SQLAlchemy предоставляет помощника для этой конкретной цели. Вместо get() можно использовать get_or_404() и вместо first() аналог first_or_404(). Это выдаст 404 ошибки вместо возврата None:

@app.route('/user/<username>')
def show_user(username):
    user = User.query.filter_by(username=username).first_or_404()
    return render_template('show_user.html', user=user)
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться