2015-01-27 5 views
1

저는 작은 웹 사이트를 만들고 있는데, 이미 내 모델이 SQLAlchemy에 있습니다. 웹 사이트는 오프라인으로 수행되는 일부 계산에서 일부 정보를 게시하는 것입니다. 결과 만 슬림화 된 데이터베이스에 게시됩니다. 즉, 결과에는 원시 데이터가 포함되지 않지만 웹 사이트는 결과를 쿼리해야합니다.Flask-SQLAlchemy 및 SQLAlchemy

내 모델이 이미 파이썬으로 구동 되었기 때문에 Flask를 사용할 것입니다. (그리고 SWIG를 통해 C++에서 다소 힘이 들었습니다.) 장고를 사용하고 싶지는 않습니다.

이제 내가 확신하기 전에 이것이 많이 요구되지 않는 일반적인 진언이지만 'Flask-SQLAlchemy 사용'이라고합니다. 그 이유는 무엇입니까?

자신이 처리하는 세션을 작성하는 경우 Flask-SQLAlchemy에서 데이터베이스를 재정의하는 추가 계층을 거쳐야하는 이유는 무엇입니까?

@app.before_request 
def before_request(): 
    g.db = connect_db() 

@app.teardown_request 
def teardown_request(exception): 
    db = getattr(g, 'db', None) 
    if db is not None: 
    db.close() 

다른 내가 걱정해야합니까 : 어딘가에 내 플라스크 응용 프로그램에 here 같은 일부 코드를 작성하는 것보다 다른? SQLAlchemy는 기본적으로 나를 위해 연결 풀링을 수행합니다.

답변

2

질문에 넣은 코드는 실제로 Sqlalchemy 통합에 유효하지 않습니다. Flask입니다. 나는 그것이 단지 예일 뿐이라는 것을 압니다.

이 SQLAlchemy의 통합을 위해 당신이 할 필요가 있는지 현재 DbSession을 만드는 것입니다 같은 것을 통해 요청의 마지막에 정리되어 DbSession이 scoped session입니다

@app.teardown_appcontext 
def shutdown_session(exception=None): 
    DbSession.remove() 

합니다.

Here is documentation Flask-Sqlalchemy 패키지를 사용하지 않으려는 경우에 해당합니다.

1

실제로 데이터베이스 관련 작업을 수행하는 Flask을 사용하여 웹 응용 프로그램을 작성하고 있습니다 (sqlalchemy). 따라서 데이터베이스 세션을 응용 프로그램이 처리하는 여러 요청으로 처리 할 때 신중하게 세션을 만들고 닫는 지 확인해야합니다. 당신은 SQLAlchemy의docs을 읽으면

, 그들은 데이터베이스 데이터 액세스 및/또는 조작 기능 및 객체 분리 및 외부 세션의 라이프 사이클을 유지하는 것이 좋습니다. 이는 예측 가능하고 일관된 트랜잭션 범위를 달성하는 데 큰 도움이됩니다.

웹 애플리케이션은 애플리케이션이 이미 일관된 단일 범위들로 생성되기 때문에, 쉬운 경우이다 - 이것은 request 인 브라우저에서 들어오는 요청을 나타내고, 그 요청의 처리는 응답을 공식화 , 그리고 마지막으로 그 응답을 클라이언트에게 전달하는 것입니다. 웹 응용 프로그램을 Session과 통합하는 것은 Session의 범위를 요청의 범위에 연결하는 직접적인 작업입니다. Session은 요청이 시작될 때 또는 필요할 때마다 설정하는 지연 초기화 패턴을 사용하여 설정할 수 있습니다. 그런 다음 요청은 실제 논리 요청 객체에 액세스하는 방식과 관련하여 응용 프로그램 논리가 현재 세션에 액세스 할 수있는 일부 시스템과 함께 진행됩니다. 요청이 끝나면 Session도 해체됩니다. 일반적으로 웹 프레임 워크에서 제공하는 이벤트 훅을 사용합니다.세션에서 사용되는 트랜잭션도이 시점에서 커밋 될 수 있습니다. 그렇지 않으면 응용 프로그램이 명백한 커밋 패턴을 선택하여 보증 된 곳의 요청에 대해서만 커밋 할 수 있지만 마지막에 무조건 항상 Session을 해체 할 수 있습니다. 평신도 측면에서

, 난 액션이 언급 위

SQLAlchemy에서 웹 응용 프로그램의 세션 각 요청 처리기를 생성하고 자신의 세션을 파괴한다는 것을 의미를 범위해야하기 때문에 말을 의미 .

웹 서버를 멀티 스레드로 구성 할 수 있기 때문에 이러한 작업이 필요합니다. 각기 다른 데이터베이스 세션에서 작동하는 여러 요청이 동시에 제공 될 수 있습니다.

플라스크SqlAlchem ​​y의를 사용하는 경우, 당신은 신중하게, 그렇지 않으면 당신은 여분의 레이어를 추가 깊은 똥에있을 수 있습니다 수동으로 scoped session을 만드는처럼 세션을 처리하고 각 요청에 그들을 제거해야한다는 것을 의미 웹 응용 프로그램의 복잡성.

그러나, Flask-SqlAlchemy 각 웹 요청의와 Session의 수명을 정렬하는 작업을 지원하는 인프라를 제공합니다 (SQLAlchemy의 Flask 응용 프로그램에 대한 라이브러리의 확장)가 제공됩니다. 실제로 SqlAlchmeydocs에서도 찾을 수 있으며 Flask과 함께 사용하는 것이 좋습니다.

플라스크-SQLAlchemy의는 각 요청에 대한 scoped session 새/신선한 만듭니다. 더 자세히 파헤 치면 여기서 app.teardown_appcontext (Flask> = 0.9 인 경우), app.teardown_request (Flask 0.7-0.8 인 경우), app.after_request (Flask < 0.7)에 후크를 설치하고 여기서 db.session.remove()을 호출합니다.