2017-12-08 50 views
0

저는 술병을 sqlalchemy와 sqlite db와 함께 사용하고 있습니다. 나는 html에서 내 .py 파일로 일부 데이터를 보내는 2 아약스있다.SQLite : 데이터베이스가 잠겼습니다

문제는이 두 가지 작업 중 하나를 수행 할 때마다 발생하며 두 번째 작업은 db 잠금 때문에 사용할 수 없게됩니다. 또한, 처음 선택한 작업이 삭제 될 경우, 어떤 작업이 선택 되더라도 예외 발생은 발생하지 않습니다. 첫 번째로 추가 할 경우 함수가 비슷해 보이기 때문에 제한없이 추가 할 수 있습니다.

다른 방법으로 세션을 닫으면 시간 제한을 시도했지만 결과는 항상 같습니다.

여기서 두 함수-핸들러이다 :이 예외가 아닌 닫힌 연결로 인한 것으로 I 읽은

app = Flask(__name__) 
csrf = CSRFProtect(app) 

app.config.from_object('config') 
db = SQLAlchemy(app) 

import forms 
import models 


@app.route('/delete', methods = ['GET', 'POST']) 
def delete(): 
    if request.method == "POST": 
     if request.form['type'] == "delete": 
      print("delete") 
      engine = create_engine(SQLALCHEMY_DATABASE_URI) 
      Session = sessionmaker(bind=engine) 
      session = Session() 

      try: 
       print("try") 
       requested = request.form['id'] 
       print(requested) 
       models.Income.query.filter(models.Income.id == requested).delete() 
       session.commit() 
      except: 
       print("rollback") 
       session.rollback() 
      finally: 
       print("fin") 
       session.close() 

      ellist = models.Income.query.all() 
      return render_template("incomeSection.html", list=ellist) 


@app.route('/add', methods=['GET', 'POST']) 
def add(): 
    if request.method == "POST": 
     if request.form['type'] == "add": 
      print('add') 
      engine = create_engine(SQLALCHEMY_DATABASE_URI) 
      Session = sessionmaker(bind=engine) 
      session = Session() 

      try: 
       print("try") 
       newItem = models.Income(name=request.form['name'], tag=request.form['tag'], 
             account=request.form['account'], 
             date=date(*(int(i) for i in request.form['date'].split("-")))) 
       session.add(newItem) 
       session.commit() 
      except: 
       print('rollback') 
       session.rollback() 
      finally: 
       print("fin") 
       session.close() 

      ellist = models.Income.query.all() 
      print(ellist) 
      return render_template("incomeSection.html", list=ellist) 

하지만 매의 .close()는 마지막 블록이있다. 문제는 db = SQLAlchemy(app) 일 수 있다고 생각하지만 그 경우 문제를 해결하는 방법을 모르겠습니다. 왜냐하면 나는이 변수를 사용하여 forms.py에있는 db와 연결할 수 있으며, 여기서 나는 폼 템플릿을 가지고 있고 models.py 내에서 db 내에서 테이블을 정의했다.

답변

0

그래서, 일반적으로 테이트는 연결 수에 문제가있었습니다. 내 문제를 해결 것은 SQLAlchemy에 대한 컨텍스트 매니저는 내가이 하나 사용했다 :

class SQLAlchemyDBConnection(object): 

def __init__(self, connection_string): 
    self.connection_string = connection_string 
    self.session = None 

def __enter__(self): 
    engine = create_engine(self.connection_string) 
    Session = sessionmaker() 
    self.session = Session(bind=engine) 
    return self 

def __exit__(self, exc_type, exc_val, exc_tb): 
    self.session.commit() 
    self.session.close() 

및 핸들러 단지

with SQLAlchemyDBConnection(SQLALCHEMY_DATABASE_URI) as db: 
      newItem = models.Income(*your params*) 
      db.session.add(newItem) 

에 그리고 지금은 잘 작동하지만 난 여전히하지 않습니다 이전 버전의 문제가 무엇인지 알아보십시오. 컨텍스트 관리자의 유무에 관계없이 동일하게 보입니다.