Подтвердить что ты не робот

Колба-sqlalchemy или sqlalchemy

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

4b9b3361

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