flask-sqlalchemy 또는 sqlalchemy


94

저는 flask와 sqlalchemy 모두에 익숙하지 않고 플라스크 앱 작업을 시작했으며 지금은 sqlalchemy를 사용하고 있습니다. flask-sqlalchemy와 sqlalchemy를 사용하여 얻을 수있는 중요한 이점이 있는지 궁금합니다. http://packages.python.org/Flask-SQLAlchemy/index.html 에서 충분한 동기를 찾을 수 없거나 값을 이해하지 못했을 수도 있습니다 !! 귀하의 설명에 감사드립니다.


6
흠, 여기에는 여전히 만족스러운 답변이 없습니다. 누구든지 Flask 앱에서 실제적인 구체적인 이점이 flask-sqlalchemy평범한 오래된 것에 대해 설명 할 수 있습니까 sqlalchemy?
Steve Bennett

하지만 한 가지 큰 단점 Flask-SqlAlchemy은 앱에서 멀티 테넌시를 설정하는 방법을 제공하지 않는다는 것입니다. 그것은 IMO의 가장 큰 부정적입니다. binds제공되는 것은 다른 모델에 다른 데이터베이스를 연결하는 것이며 동일한 모델에 테넌트 별 데이터베이스를 사용할 수있는 방법은 없습니다.
Rohit Jain

답변:


69

의 주요 기능 Flask-SQLAlchemy Flask 애플리케이션과의 적절한 통합입니다. 엔진, 연결 및 세션을 생성 및 구성하고 Flask 앱과 함께 작동하도록 구성합니다.

이 설정은 범위가 지정된 세션 을 만들고 Flask 애플리케이션 요청 / 응답 수명주기에 따라 적절하게 처리 해야하므로 매우 복잡 합니다.

의 유일한 기능이 될 이상적인 세계에서는 Flask-SQLAlchemy실제로 몇 가지 추가 기능이 추가됩니다. 다음은 이에 대한 개요가 포함 된 좋은 블로그 게시물입니다. Demystifying Flask-SQLAlchemy .

Flask와 SQLAlchemy를 처음 사용했을 때이 오버 헤드가 마음에 들지 않았습니다. 확장 프로그램에서 세션 관리 코드를 추출했습니다. 이 접근 방식은 작동하지만이 통합을 제대로 수행하는 것이 매우 어렵다는 것을 발견했습니다.

따라서 (내가 작업하고있는 다른 프로젝트에서 사용되는) 더 쉬운 접근 방식은 그냥 들어가서 Flask-SQLAlchemy제공하는 추가 기능을 사용하지 않는 것입니다. 당신은 db.session그것을 가질 것이고 마치 순수한 SQLAlchemy설정 인 것처럼 사용할 수 있습니다 .


4
나는 혼란스러워한다. 링크 된 블로그 게시물 (및 공식 문서!)에는 Flask-SQLAlchemy 기능인 것처럼 일반 SQLAlchemy 기능 (예 : 선언적 기반)이 나열되어 있습니다. SQLAlchemy에 내장 된 항목에 대한 크레딧을 받는지 아니면 다시 구현했는지 ( 후자 인 경우 그렇게 했는지) 불분명합니다 . 첫 번째 단락에는 세션 관리를위한 편의 래퍼 (하지만 Flask 외부에서 SQLAlchemy 모델을 사용하려는 경우 자체적으로 롤링 할 필요가 없습니까?)와 " Flask 앱으로 작업 "하는 일부 지정되지 않은 "구성"이 있습니다. . 그게 무슨 입니까?
Mark Amery

1
나는 또한 질문에 약간 혼란스러워합니다. 링크 된 블로그 게시물은 매우 분명한 IMO입니다. 예를 들어 "쿼리 속성 및 페이지 매김을 지원하는 사용자 지정 선언적 기본 모델"이라는 키가 "사용자 지정"이고 "쿼리 속성 및 페이지 매김 지원 포함"이 추가 된 것입니다. SQLAlchemy의 선언적 기반.
Boris Serebrov 2018 년

1
"편리한 래퍼"와 관련하여-편의를위한 것이 아니라 제대로 작동하도록하기위한 것입니다. SQLAlchemy 사용을 시작하려면 데이터베이스 연결 (ennge / 연결 / 세션) 개체가 필요하며 SQL 쿼리를 만들어야 할 때마다 이러한 개체를 만들고 싶지 않으므로 응용 프로그램 코드 전체에서 전역 적으로 생성하고 사용할 수 있어야합니다. 따라서 "from yourapplication import db"와 같은 작업을 수행 한 다음 "db"객체를 올바르게 만들고 초기화하는 방법을 생각하지 않고 "db.session.something ()"을 수행 할 수 있습니다.
Boris Serebrov 2018 년

그리고 "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 문서를 참조하십시오 . 세션을 생성 할 때, 커밋 할 때, 언제 수행해야합니까? 닫아? 컨텍스트 / 스레드-로컬 세션 .
Boris Serebrov 2018 년

21

솔직히 말해서 어떤 혜택도 보이지 않습니다. IMHO, Flask-SQLAlchemy는 실제로 필요하지 않은 추가 계층을 만듭니다. 우리의 경우 ORM과 Core를 모두 사용하는 여러 데이터베이스 / 연결 (마스터-슬레이브)이있는 상당히 복잡한 Flask 애플리케이션이 있는데, 여기서 세션 / DB 트랜잭션을 제어해야합니다 (예 : 드라 이런 대 커밋 모드). Flask-SQLAlchemy는 세션 자동 소멸과 같은 몇 가지 추가 기능을 추가합니다.


6
예, 사용 사례에서 Flask-SQLAlchemy는 더 이상 사용되지 않는 것 같습니다. 그러나 OP가 그러한 시나리오를 가지고 있다면 그는 아마도이 질문을하지 않을 것입니다. 세션 범위 에 대해 아무것도 모르는 새 사용자에게는 Flask-SQLAlchemy가 반드시 필요합니다!
schlamar 2013 년

21

Flask-SQLAlchemy는 SQLAlchemy를 사용하여 직접 구현할 수있는 몇 가지 멋진 추가 기능을 제공합니다.

Flask-SQLAlchemy 사용에 대한 긍정적 인 측면


  1. Flask_SQLAlchemy는 세션 구성, 설정 및 해체를 처리합니다.
  2. 쿼리 및 페이지 매김을 더 쉽게 만드는 선언적 기본 모델을 제공합니다.
  3. 백엔드 특정 설정 .Flask-SQLAlchemy는 유니 코드 지원을 위해 설치된 라이브러리를 검색하고 실패 할 경우 자동으로 SQLAlchemy 유니 코드를 사용합니다.
  4. apply_driver_hacksMySQL 풀 크기와 같은 thigs에 대한 정상적인 기본값을 자동으로 설정 하는 메서드 가 있습니다.
  5. 모든 테이블을 만들고 삭제하기 위해 create_all () 및 drop_all () 메서드에 멋진 빌드가 있습니다. 어리석은 일을 한 경우 테스트 및 Python 명령 줄에서 유용합니다.
  6. > http://flask-sqlalchemy.pocoo.org/2.1/queries/ 에서 find () 코드 예제 대신 get () 및 find_or_404 () 대신 get_or_404 ()를 제공합니다.

테이블 이름을 자동으로 설정합니다. Flask-SQLAlchemy는 자동으로 테이블 이름을 설정합니다. ClassName> class_name이것은 __tablename__클래스 목록 항목 을 설정하여 재정의 할 수 있습니다.

Flask-SQLAlchemy 사용에 대한 부정적인 측면


  1. Flask-SQLAlchemy를 사용하면 필요한 경우 Pyramid를 사용하여 Flask에서 마이그레이션하는 데 추가적인 어려움이 추가됩니다. 이는 주로 Flask_SQLAchemy의 사용자 지정 선언적 기본 모델 때문입니다.
  2. Flask-SQLAlchemy를 사용하면 SQLAlchemy 자체보다 훨씬 작은 커뮤니티가있는 패키지를 사용할 위험이 있습니다.이 패키지는 곧 활성 개발에서 쉽게 삭제할 수 없습니다.
  3. Flask-SQLAlchemy가 가지고있는 몇 가지 멋진 추가 기능은 이들이 있는지 모르는 경우 혼란스럽게 만들 수 있습니다.

16

SQLAlchemy 설명서에는 Flask-SQLAlchemy를 사용해야한다고 명시되어 있습니다 (특히 이점을 이해하지 못하는 경우).

[...] Flask-SQLAlchemy와 같은 제품 [...] SQLAlchemy는 이러한 제품을 사용 가능한 상태로 사용할 것을 강력히 권장합니다.

이 인용문과 자세한 동기는 세션 FAQ 의 두 번째 질문에서 찾을 수 있습니다 .


2
Flask-sqlalchemy는 유지되지 않는 것 같습니다. 마지막 업데이트는 2013 년 8 월 1 일이었습니다.이 조언이 더 이상 관련이 있습니까?
pmav99

@ pmav99에 대한 구체적인 문제가없는 한 특히 신규 사용자에게 특히 권장합니다.
schlamar

1
2014 년 11 월 현재 적극적으로 유지 될 것으로 보입니다. 최근 많은 커밋. github.com/mitsuhiko/flask-sqlalchemy/commits/master
스티브 베넷

25
OP가 직접 묻지는 않았지만, imo. 그는 Flask-SQLAlchemy의 이점을 알고 싶었습니다. 귀하의 대답은 문자 그대로 "혜택이 무엇인지 모르더라도 사용"입니다. 예, 혜택은 무엇입니까?
Markus Meskanen 2011

1
이 답변은 OP의 질문에 대한 답변이 아닙니다. 당신은 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를 사용하면 여기에 전혀 새로운 것이 없습니다.
Markus Meskanen

당신은 대단합니다! 나는이 게시물을 우연히 발견하고 내가 가진 문제를 해결했습니다. 아나콘다를 설치 한 후 어떤 이유로 정상적인 업데이트가 작동하지 않았습니다. 어떤 이유로 에서 Model.query.all()로 변경 db.session.query(Model).all()되면 세션이 정상적으로 추적되고 업데이트됩니다.
Jeff Bluemel

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가 아님)를 사용하는 경우 개체가 데이터베이스에 저장되는 방식 (예 : 테이블 이름)에 대해 다른 가정을 할 수 있으므로 자체 어댑터 클래스를 작성해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.