flask-sqlalchemy або sqlalchemy


93

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


6
Хм, тут досі немає задовільної відповіді. Хто-небудь може пояснити, які фактичні конкретні переваги flask-sqlalchemyє надто старими sqlalchemyу програмі Flask?
Стів Беннетт,

Одним із великих недоліків є те, що Flask-SqlAlchemyвін не забезпечує жодного способу налаштування багатоквартирного житла в додатку. Це найбільший негатив ІМО. bindsнадається лише приєднання іншої бази даних до іншої моделі, тоді як немає можливості використовувати базу даних, що стосується орендаря, з тією ж моделлю.
Рохіт Джейн

Відповіді:


67

Головною особливістю програми Flask-SQLAlchemyє правильна інтеграція з програмою Flask - вона створює та налаштовує движок, підключення та сеанс і налаштовує її на роботу з програмою Flask.

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

В ідеальному світі це було б єдиною особливістю Flask-SQLAlchemy, але насправді це додало ще кілька речей. Ось хороший допис у блозі з їх оглядом: Demystifying Flask-SQLAlchemy .

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

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


4
Я залишаюся розгубленим. У пов’язаному дописі в блозі (та офіційних документах!) Перелічені деякі прості функції SQLAlchemy (наприклад, декларативна база), ніби вони є функціями Flask-SQLAlchemy; незрозуміло, чи беруть вони кредит на речі, вбудовані в SQLAlchemy, чи вони їх реалізовували (ані чому це зробили, якщо це останнє). У вашому першому абзаці перелічені дві функції: зручні обгортки для управління сеансами (але чи не потрібно вам все одно прокручувати власні, якщо ви хочете використовувати свої моделі SQLAlchemy за межами Flask?) Та деякі невизначені "конфігурації" для "роботи з додатком Flask" . Що це означає ?
Mark Amery

1
Мене також трохи бентежать питання. Пов’язана публікація в блозі є цілком зрозумілою IMO, наприклад, у ній сказано: «Спеціальна декларативна базова модель із підтримкою властивості запиту та пагінацією», ключ - «спеціальний», а «з підтримкою властивості запиту та пагінацією» - це те, що додається поверх Декларативна база SQLAlchemy.
Борис Серебров,

1
Щодо "обгорткових приладів" - вони не для зручності, а для того, щоб речі працювали належним чином. Щоб почати використовувати SQLAlchemy, вам потрібні об'єкти підключення до бази даних (eninge / з'єднання / сеанс), і ви не хочете створювати їх кожен раз, коли вам потрібно зробити запит SQL, тому вони повинні бути створені глобально та доступні в коді програми. Таким чином, ви можете зробити щось на зразок "з вашої програми імпорту 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: Коли я будую сеанс, коли я його фіксую, і коли я закрий це? та контекстні / локальні сеанси .
Борис Серебров

20

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


5
Так, у вашому випадку використання Flask-SQLAlchemy здається застарілим. Але якщо у ОП буде такий сценарій, він, ймовірно, не буде задавати цього питання. Для нового користувача, який нічого не знає про обсяг сеансу, Flask-SQLAlchemy, безумовно, обов’язковий!
schlamar

20

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 на припустимо Піраміду, якщо вам коли-небудь знадобиться. Це пов’язано головним чином із власною декларативною базовою моделлю на Flask_SQLAchemy.
  2. Використовуючи Flask-SQLAlchemy, ви ризикуєте використовувати пакет із набагато меншим співтовариством, ніж сама SQLAlchemy, який я не можу швидко відмовитись від активної розробки найближчим часом.
  3. Деякі приємні статисти, які має Flask-SQLAlchemy, можуть змусити вас розгубитися, якщо ви не знаєте, що вони там є.

15

У документації SQLAlchemy чітко зазначено, що ви повинні використовувати Flask-SQLAlchemy (особливо якщо ви не розумієте його переваг!):

[...] продукти, такі як Flask-SQLAlchemy [...] SQLAlchemy настійно рекомендує використовувати ці продукти у наявності.

Цю цитату та детальну мотивацію ви можете знайти у другому питанні запитання про сесію .


2
Здається, склянка-хімія не підтримується. Останнє оновлення було 1 серпня 2013 року. Чи актуальна ця порада вже?
pmav99

@ pmav99, поки у вас немає конкретних проблем з ним, я все одно рекомендую його, особливо для нових користувачів.
schlamar

1
Здається, активно підтримуватиметься станом на листопад 2014 року. Багато останніх комісій. github.com/mitsuhiko/flask-sqlalchemy/commits/master
Steve Bennett

25
Незважаючи на те, що OP не запитував це безпосередньо, imo. він хотів знати переваги Flask-SQLAlchemy. Ваша відповідь буквально "використовуйте, навіть якщо ви не знаєте, які переваги" - так, які переваги?
Маркус Месканен,

1
Ця відповідь не відповідає на запитання ОП. Ви рекомендуєте flask-sqlalchemy, не надаючи багато аргументів за цією рекомендацією.
mbadawi23,

7

як @schlamar припускає, Flask-SqlAlchemy - це дефо хороша річ. Я просто хотів би додати якийсь додатковий контекст до справи, зробленої там.

Не відчувайте, що ви обираєте одне над іншим. Наприклад, скажімо, що ми хочемо захопити всі записи з таблиці за допомогою моделі за допомогою Flask-Sqlalchemy. Це так просто, як

Model.query.all()

Для багатьох простих випадків Фляска-Склалхімія буде абсолютно нормальною. Додатковим моментом, який я хотів би сказати, є те, що якщо 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 (не-flask-sqlalchemy), ви можете робити різні припущення щодо способу збереження об'єктів у базі даних (наприклад, імен таблиць), тому вам доведеться писати власний клас адаптера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.