Я новичок как в flask, так и в sqlalchemy, я только начинаю работать над приложением flask, а сейчас использую sqlalchemy. Мне было интересно, есть ли какое-либо существенное преимущество, которое я могу получить от использования flask-sqlalchemy против sqlalchemy. Я не смог найти достаточно мотивов в http://packages.python.org/Flask-SQLAlchemy/index.html или, может быть, я не понял значение !! Буду признателен за ваши разъяснения.
95
flask-sqlalchemy
сравнению с простым старымsqlalchemy
в приложении Flask?Flask-SqlAlchemy
что в приложении нет возможности настроить мультитенантность. Это самый большой недостаток ИМО.binds
предоставляется только для присоединения другой базы данных к другой модели, в то время как нет возможности использовать базу данных для конкретного клиента с той же моделью.Ответы:
Основная особенность
Flask-SQLAlchemy
- правильная интеграция с приложением Flask - он создает и настраивает движок, соединение и сеанс, а также настраивает его для работы с приложением Flask.Эта настройка довольно сложна, поскольку нам нужно создать сеанс с ограниченной областью действия и правильно обработать его в соответствии с жизненным циклом запроса / ответа приложения Flask.
В идеальном мире это было бы единственной особенностью
Flask-SQLAlchemy
, но на самом деле это добавляет еще несколько вещей. Вот хорошая запись в блоге с их обзором: Демистификация Flask-SQLAlchemy .Когда я впервые работал с Flask и SQLAlchemy, мне не нравились эти накладные расходы. Я подошел и извлек код управления сеансом из расширения. Этот подход работает, хотя я обнаружил, что выполнить эту интеграцию должным образом довольно сложно.
Таким образом, более простой подход (который используется в другом проекте, над которым я работаю) - просто отказаться от
Flask-SQLAlchemy
использования каких-либо дополнительных функций, которые он предоставляет. У вас будетdb.session
и вы сможете использовать его, как если бы это была чистаяSQLAlchemy
настройка.источник
This setup is quite complex as we need to create the scoped session and properly handle it according to the Flask application request/response life-cycle.
см. Более подробную информацию в документации SQLAlchemy: когда я создаю сеанс, когда я фиксирую его и когда я закрой его? и контекстные / локальные сеансы .Flask-SQLAlchemy дает вам ряд приятных дополнений, которые в противном случае вы бы реализовали самостоятельно с помощью SQLAlchemy.
Положительные стороны использования Flask-SQLAlchemy
apply_driver_hacks
который автоматически устанавливает разумные значения по умолчанию для таких задач, как размер пула MySQL.Автоматически устанавливать имена таблиц. Flask-SQLAlchemy автоматически устанавливает имена таблиц, преобразуя ваши
ClassName
>class_name
это можно переопределить, установив__tablename__
элемент списка классаОтрицательные стороны использования Flask-SQLAlchemy
источник
Если честно, то плюсов не вижу. IMHO, Flask-SQLAlchemy создает дополнительный слой, который вам действительно не нужен. В нашем случае у нас есть довольно сложное приложение Flask с несколькими базами данных / подключениями (master-slave), использующее как ORM, так и Core, где, среди прочего, нам нужно контролировать наши сеансы / транзакции БД (например, режимы dryrun и commit). Flask-SQLAlchemy добавляет некоторые дополнительные функции, такие как автоматическое уничтожение сеанса, предполагая некоторые вещи для вас, которые очень часто не то, что вам нужно.
источник
В документации SQLAlchemy четко указано, что вам следует использовать Flask-SQLAlchemy (особенно если вы не понимаете его преимуществ!):
Эту цитату и подробную мотивацию вы можете найти во втором вопросе FAQ сессии .
источник
поскольку @schlamar предполагает, что Flask-SqlAlchemy - это хорошо. Я просто хотел бы добавить дополнительный контекст к тому, что там сказано.
Не думайте, что вы выбираете одно другому. Например, допустим, мы хотим получить все записи из таблицы, используя модель, использующую Flask-Sqlalchemy. Это так просто, как
Во многих простых случаях 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.
источник
Model.query.all()
» - все это можно сделать только с помощью SQLAlchemy, использование Flask-SQLAlchemy не дает здесь абсолютно ничего нового.Model.query.all()
наdb.session.query(Model).all()
по какой-то причине позволил сессиям отслеживать и обновлять как обычно.Вот пример преимущества flask-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), вы можете сделать разные предположения о том, как объекты сохраняются в базе данных (например, имена таблиц), поэтому вам придется написать свой собственный класс адаптера.
источник