Я новичок в обеих флягах и sqlalchemy, я только начинаю работать над флеш-приложением, и сейчас я использую sqlalchemy. Мне было интересно, есть ли какая-то значительная выгода от использования колба-sqlalchemy против sqlalchemy. Я не мог найти достаточных мотивов в http://packages.python.org/Flask-SQLAlchemy/index.html, или, может быть, я не понял значения!! Я был бы признателен за ваши разъяснения.
Колба-sqlalchemy или sqlalchemy
Ответ 1
Основной функцией Flask-SQLAlchemy
является правильная интеграция с приложением Flask - она создает и настраивает движок, соединение и сеанс и настраивает его для работы с флеш-приложением.
Эта настройка довольно сложна, так как нам нужно создать scoped session и надлежащим образом обрабатывать ее в соответствии с жизненным циклом запроса/ответа на флэшку.
В идеальном мире, который был бы единственной особенностью Flask-SQLAlchemy
, но на самом деле он добавляет еще несколько вещей. Вот хороший пост в блоге с их обзором: Demystifying Flask-SQLAlchemy.
Когда я впервые работал с Flask и SQLAlchemy, мне не нравились эти накладные расходы. Я перешел и извлек код управления сеансом из расширения. Этот подход работает, хотя я обнаружил, что выполнить эту интеграцию довольно сложно.
Таким образом, более простой подход (который используется в другом проекте, над которым я работаю) - это просто отказаться от Flask-SQLAlchemy
и не использовать какие-либо дополнительные функции, которые он предоставляет. У вас будет db.session
, и вы можете использовать его, как если бы он был чистым SQLAlchemy
.
Ответ 2
В документации SQLAlchemy четко указано, что вы должны использовать Flask-SQLAlchemy (особенно, если вы не понимаете ее преимуществ!):
[...] такие продукты, как Flask-SQLAlchemy [...] SQLAlchemy настоятельно рекомендует использовать эти продукты как доступные.
Эта цитата и подробная мотивация вы можете найти во втором вопросе Часто задаваемые вопросы сеанса.
Ответ 3
Честно говоря, я не вижу никаких преимуществ. IMHO, Flask-SQLAlchemy создает дополнительный слой, который вам действительно не нужен. В нашем случае у нас довольно сложное приложение Flask с несколькими базами данных/соединениями (master-slave) с использованием ORM и Core, где, помимо прочего, нам нужно контролировать транзакции сеансов/БД (например, режимы dryrun vs commit). Flask-SQLAlchemy добавляет некоторые дополнительные функции, такие как автоматическое разрушение сеанса, предполагающее некоторые вещи для вас, что очень часто не то, что вам нужно.
Ответ 4
как @schlamar предлагает Flask-SqlAlchemy - дефо-то хорошо. Id просто добавляет дополнительный контекст к точке, сделанной там.
Не чувствуй, как ты выбираешь один над другим. Например, предположим, что мы хотим захватить все записи из таблицы с использованием модели с использованием Flask-Sqlalchemy. Это так же просто, как
Model.query.all()
Для многих простых случаев Flask-Sqlalchemy будет полностью прекрасным. Дополнительная точка, которую я хотел бы сделать, заключается в том, что если Flask-Sqlalchemy не будет делать то, что вы хотите, то нет причин, по которым вы не можете напрямую использовать SqlAlchemy.
from myapp.database import db
num_foo = db.session.query(func.count(OtherModel.id)).filter(is_deleted=False).as_scalar()
db.session.query(Model.id, num_foo.label('num_foo')).order_by('num_foo').all()
Как вы можете видеть, мы можем легко перейти от одного к другому без проблем, а во втором примере мы фактически используем определенные модели Flask-Sqlalchemy.
Ответ 5
Flask-SQLAlchemy дает вам несколько приятных дополнений, которые вам еще предстоит реализовать с помощью SQLAlchemy.
Положительные стороны при использовании Flask-SQLAlchemy
- Flask_SQLAlchemy обрабатывает конфигурацию сеанса, настройку и отключение для вас.
- Дает вам декларативную базовую модель, облегчающую запрос и разбивку на страницы.
- Специфичные параметры backend. Flask-SQLAlchemy сканирует установленные библиотеки для поддержки Unicode, и если сбой автоматически использует SQLAlchemy Unicode.
- Есть метод под названием
apply_driver_hacks
, который автоматически устанавливает стандартные значения по умолчанию для тигров, таких как размер пула MySQL - Хорошая сборка методов create_all() и drop_all() для создания и удаления всех таблиц. Полезно для тестирования и в командной строке python, если вы сделали что-то глупое.
- Он дает вам get_or_404() вместо get() и find_or_404() вместо find() Пример кода в > http://flask-sqlalchemy.pocoo.org/2.1/queries/
Автоматически устанавливать имена таблиц. Flask-SQLAlchemy автоматически устанавливает ваши имена таблиц, преобразующие ваш ClassName
> class_name
, это можно переопределить, установив __tablename__
class
Элемент списка
Отрицательные стороны при использовании Flask-SQLAlchemy
- Использование Flask-SQLAlchemy создаст дополнительные трудности для мигрируя из Flask, чтобы сказать "Пирамида", если вам когда-нибудь понадобится. Это в основном связано с пользовательской декларативной базовой моделью на Flask_SQLAchemy.
- Используя Flask-SQLAlchemy, вы рискуете использовать пакет с гораздо меньшим сообществом, чем сама SQLAlchemy, и я скоро не могу отказаться от активной разработки.
- Некоторые приятные дополнения Flask-SQLAlchemy могут смутить вас, если вы не знаете, что они есть.
Ответ 6
Вот пример полезной колбы-sqlalchemy дает вам простую sqlalchemy.
Предположим, вы используете flask_user.
flask_user автоматизирует создание и аутентификацию пользовательских объектов, поэтому ему необходимо получить доступ к вашей базе данных. Класс UserManager делает это, перейдя к чему-то, называемому "адаптером", который абстрагирует вызовы базы данных. Вы предоставляете адаптер в конструкторе UserManager, и адаптер должен реализовать следующие функции:
class MyAdapter(DBAdapter):
def get_object(self, ObjectClass, id):
""" Retrieve one object specified by the primary key 'pk' """
pass
def find_all_objects(self, ObjectClass, **kwargs):
""" Retrieve all objects matching the case sensitive filters in 'kwargs'. """
pass
def find_first_object(self, ObjectClass, **kwargs):
""" Retrieve the first object matching the case sensitive filters in 'kwargs'. """
pass
def ifind_first_object(self, ObjectClass, **kwargs):
""" Retrieve the first object matching the case insensitive filters in 'kwargs'. """
pass
def add_object(self, ObjectClass, **kwargs):
""" Add an object of class 'ObjectClass' with fields and values specified in '**kwargs'. """
pass
def update_object(self, object, **kwargs):
""" Update object 'object' with the fields and values specified in '**kwargs'. """
pass
def delete_object(self, object):
""" Delete object 'object'. """
pass
def commit(self):
pass
Если вы используете flask-sqlalchemy, вы можете использовать встроенный SQLAlchemyAdapter. Если вы используете sqlalchemy (not-flask-sqlalchemy), вы можете сделать разные предположения о том, как объекты сохраняются в базе данных (например, имена таблиц), поэтому вам придется написать собственный класс адаптера.