2017-12-08 20 views
1

플라스크에 간단한 프로젝트를 만들어야합니다. 나는 SQLAlchemy를 사용하고 싶지 않다. 아래의 코드 조각에서 서버에 연결하는 모든 사용자는 동일한 연결 개체를 사용하지만 각 요청에 대해 새 커서 개체가 만들어집니다. 이런 식으로 전에 Python DB API를 사용 해본 적이 없기 때문에 나는 이것을 묻는다. 맞습니까? 각 요청에 대해 새 연결 개체를 만들거나 아래의 각 요청 또는 메서드에 대해 동일한 연결 및 커서 개체를 사용해야합니까? 어느 것이 옳은가요?WSGI 응용 프로그램에서 전역 데이터베이스 연결이 허용됩니까?

import mysql.connector 
from flask import Flask, request 
app = Flask(__name__) 

try: 
    con = mysql.connector.connect(user='root',password='',host='localhost',database='pywork') 
except mysql.connector.Error as err: 
    print("Something went wrong") 

@app.route('/') 
def home(): 
    cursor = con.cursor() 
    cursor.execute("INSERT INTO table_name VALUES(NULL,'test record')") 
    con.commit() 
    cursor.close() 
    return "" 
+0

트랜잭션 (사용 가능한 경우)을 커서가 아닌 연결에 바인드 한 후에는 요청 당 데이터베이스 명령이 트랜잭션을 필요로하는 즉시 요청마다 별도의 연결이 있어야합니다 (데이터베이스가 일관성없는 상태가되는 것을 피하기 위해) . – moooeeeep

+0

@moooeeeep 네가 맞아. 조만간 connection 객체를 사용하여 commit 메소드를 사용하여 Sql 쿼리를 실행합니다. 나는 그것에 대해 생각하지 않았다. 당신의 도움을 주셔서 감사합니다. – amone

답변

0

WSGI 응용 프로그램은 여러 작업자 프로세스 및 스레드에 의해 제공 될 수 있습니다. 따라서 동일한 연결을 사용하여 여러 스레드가 종료 될 수 있습니다. 따라서 라이브러리의 연결 구현이 스레드로부터 안전한지 여부를 알아야합니다. 문서를보고 Level 2 thread safety을 제공한다고 주장하는지 확인하십시오.

그런 다음 요청하는 동안 거래가 필요한지 여부를 반영해야합니다. 트랜잭션이 필요하다면 (예 : 요청이 서로 다른 상태 또는 가능한 경쟁 조건으로 인해 여러 데이터베이스 명령을 실행하는 경우) 트랜잭션이 항상 연결되어 있기 때문에 다른 연결을 사용해야합니다. 일부 데이터베이스 시스템 또는 구성은 트랜잭션을 지원하지 않거나 서로 별도의 연결을 격리하지 않습니다.

따라서 연결을 공유하는 경우 autocommit을 사용하는 것으로 가정해야합니다 (실제로는 그렇게하는 것이 좋습니다).

+0

아파치를 사용하여이 앱을 배포 할 계획입니다. 이 경우 연결 개체가 모든 사람이 동시에 사용하게됩니다. – amone