flask-sqlalchemy или sqlalchemy

95

Я новичок как в flask, так и в sqlalchemy, я только начинаю работать над приложением flask, а сейчас использую sqlalchemy. Мне было интересно, есть ли какое-либо существенное преимущество, которое я могу получить от использования flask-sqlalchemy против sqlalchemy. Я не смог найти достаточно мотивов в http://packages.python.org/Flask-SQLAlchemy/index.html или, может быть, я не понял значение !! Буду признателен за ваши разъяснения.

Амин
источник
6
Хм, здесь все еще нет удовлетворительного ответа. Может ли кто-нибудь объяснить, какие реальные конкретные преимущества по flask-sqlalchemyсравнению с простым старым sqlalchemyв приложении Flask?
Стив Беннетт
Однако один большой недостаток заключается в том, Flask-SqlAlchemyчто в приложении нет возможности настроить мультитенантность. Это самый большой недостаток ИМО. bindsпредоставляется только для присоединения другой базы данных к другой модели, в то время как нет возможности использовать базу данных для конкретного клиента с той же моделью.
Рохит Джайн

Ответы:

70

Основная особенность Flask-SQLAlchemy- правильная интеграция с приложением Flask - он создает и настраивает движок, соединение и сеанс, а также настраивает его для работы с приложением Flask.

Эта настройка довольно сложна, поскольку нам нужно создать сеанс с ограниченной областью действия и правильно обработать его в соответствии с жизненным циклом запроса / ответа приложения Flask.

В идеальном мире это было бы единственной особенностью Flask-SQLAlchemy, но на самом деле это добавляет еще несколько вещей. Вот хорошая запись в блоге с их обзором: Демистификация Flask-SQLAlchemy .

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

Таким образом, более простой подход (который используется в другом проекте, над которым я работаю) - просто отказаться от Flask-SQLAlchemyиспользования каких-либо дополнительных функций, которые он предоставляет. У вас будет db.sessionи вы сможете использовать его, как если бы это была чистая SQLAlchemyнастройка.

Борис Серебров
источник
4
Я все еще в замешательстве. В связанном сообщении блога (и официальной документации!) Перечислены некоторые простые функции SQLAlchemy (например, декларативная база), как если бы они были функциями Flask-SQLAlchemy; неясно, принимают ли они кредит на вещи, встроенные в SQLAlchemy, или они его повторно реализовали (и почему они это сделали, если последнее). В вашем первом абзаце перечислены две функции: удобные оболочки для управления сеансом (но разве вам не нужно будет менять свои собственные, если вы хотите использовать свои модели SQLAlchemy вне Flask?) И некоторую неуказанную «конфигурацию» для «работы с приложением Flask» . Что это значит ?
Марк Эмери
1
Меня тоже немного смущают вопросы. Связанное сообщение в блоге довольно ясно IMO, например, в нем говорится: «Пользовательская декларативная базовая модель с поддержкой свойств запроса и разбивки на страницы», ключ - «настраиваемый», а «с поддержкой свойств запроса и разбивки на страницы» - это то, что он добавляет поверх Декларативная база SQLAlchemy.
Борис Серебров
1
Что касается «удобных оберток» - они не для удобства, а для правильной работы. Чтобы начать использовать SQLAlchemy, вам понадобятся объекты подключения к базе данных (eninge / connection / session), и вы не хотите создавать их каждый раз, когда вам нужно сделать SQL-запрос, поэтому они должны создаваться глобально и доступны для всего кода приложения. Таким образом, вы можете сделать что-то вроде «from yourapplication import db», а затем выполнить «db.session.something ()», не думая о том, как правильно создать и инициализировать этот объект «db».
Борис Серебров
А что касается неуказанной «конфигурации» для «работы с приложением Flask» - она ​​фактически указана во втором абзаце: 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: когда я создаю сеанс, когда я фиксирую его и когда я закрой его? и контекстные / локальные сеансы .
Борис Серебров
22

Flask-SQLAlchemy дает вам ряд приятных дополнений, которые в противном случае вы бы реализовали самостоятельно с помощью SQLAlchemy.

Положительные стороны использования Flask-SQLAlchemy


  1. Flask_SQLAlchemy обрабатывает конфигурацию сеанса, настройку и удаление за вас.
  2. Предоставляет вам декларативную базовую модель, которая упрощает запросы и разбиение на страницы
  3. Параметры, специфичные для серверной части. Flask-SQLAlchemy сканирует установленные библиотеки на предмет поддержки Unicode и в случае сбоя автоматически использует SQLAlchemy Unicode.
  4. Имеет вызываемый метод, apply_driver_hacksкоторый автоматически устанавливает разумные значения по умолчанию для таких задач, как размер пула MySQL.
  5. Имеет удобные встроенные методы create_all () и drop_all () для создания и удаления всех таблиц. Полезно для тестирования и в командной строке Python, если вы сделали что-то глупое
  6. Он дает вам get_or_404 () вместо get () и find_or_404 () вместо find () Пример кода в> http://flask-sqlalchemy.pocoo.org/2.1/queries/

Автоматически устанавливать имена таблиц. Flask-SQLAlchemy автоматически устанавливает имена таблиц, преобразуя ваши ClassName> class_nameэто можно переопределить, установив __tablename__элемент списка класса

Отрицательные стороны использования Flask-SQLAlchemy


  1. Использование Flask-SQLAlchemy добавит дополнительных трудностей для перехода с Flask на, скажем, Pyramid, если вам когда-нибудь понадобится. В основном это связано с настраиваемой декларативной базовой моделью Flask_SQLAchemy.
  2. Используя Flask-SQLAlchemy, вы рискуете использовать пакет с гораздо меньшим сообществом, чем сам SQLAlchemy, который я не могу легко отказаться от активной разработки в ближайшее время.
  3. Некоторые приятные дополнения Flask-SQLAlchemy могут сбить вас с толку, если вы не знаете, что они есть.
Киммо Хинтикка
источник
21

Если честно, то плюсов не вижу. IMHO, Flask-SQLAlchemy создает дополнительный слой, который вам действительно не нужен. В нашем случае у нас есть довольно сложное приложение Flask с несколькими базами данных / подключениями (master-slave), использующее как ORM, так и Core, где, среди прочего, нам нужно контролировать наши сеансы / транзакции БД (например, режимы dryrun и commit). Flask-SQLAlchemy добавляет некоторые дополнительные функции, такие как автоматическое уничтожение сеанса, предполагая некоторые вещи для вас, которые очень часто не то, что вам нужно.

MOCKBA
источник
6
Да, в вашем случае использования Flask-SQLAlchemy кажется устаревшим. Но если у ОП будет такой сценарий, он, вероятно, не задаст этот вопрос. Для нового пользователя, который ничего не знает об области сеанса, Flask-SQLAlchemy определенно необходим!
schlamar 07
16

В документации SQLAlchemy четко указано, что вам следует использовать Flask-SQLAlchemy (особенно если вы не понимаете его преимуществ!):

[...] такие продукты, как Flask-SQLAlchemy [...] SQLAlchemy настоятельно рекомендуют использовать эти продукты по мере их наличия.

Эту цитату и подробную мотивацию вы можете найти во втором вопросе FAQ сессии .

Schlamar
источник
2
Кажется, что Flask-sqlalchemy не поддерживается. Последнее обновление было 1 августа 2013 года. Актуален ли этот совет?
pmav99
@ pmav99, если у вас нет конкретных проблем с ним, я все равно рекомендую его, особенно для новых пользователей.
schlamar
1
Похоже, активно поддерживается с ноября 2014 года. Множество недавних коммитов. github.com/mitsuhiko/flask-sqlalchemy/commit/master
Стив Беннетт,
26
Хотя ОП не спрашивал об этом напрямую, имо. он хотел узнать о преимуществах Flask-SQLAlchemy. Ваш ответ буквально «используйте это, даже если вы не знаете, каковы преимущества» - да, каковы преимущества?
Маркус Месканен 07
1
Этот ответ не отвечает на вопрос ОП. Вы рекомендуете flask-sqlalchemy, не приводя особых аргументов в пользу этой рекомендации.
mbadawi23
7

поскольку @schlamar предполагает, что Flask-SqlAlchemy - это хорошо. Я просто хотел бы добавить дополнительный контекст к тому, что там сказано.

Не думайте, что вы выбираете одно другому. Например, допустим, мы хотим получить все записи из таблицы, используя модель, использующую 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.

Майк Уэйтс
источник
1
«Например, допустим, мы хотим получить все записи из таблицы, используя модель, использующую Flask-Sqlalchemy. Это так просто, как Model.query.all()» - все это можно сделать только с помощью SQLAlchemy, использование Flask-SQLAlchemy не дает здесь абсолютно ничего нового.
Маркус Месканен
ты обалденный! Я наткнулся на этот пост, и он решил мою проблему. после того, как я установил анаконду, по какой-то причине нормальные обновления не работали. изменен с Model.query.all()на db.session.query(Model).all()по какой-то причине позволил сессиям отслеживать и обновлять как обычно.
Джефф Блюмел
2

Вот пример преимущества 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), вы можете сделать разные предположения о том, как объекты сохраняются в базе данных (например, имена таблиц), поэтому вам придется написать свой собственный класс адаптера.

2-комплексный
источник