2017-12-08 35 views
0

私はsqlalchemyとsqlite dbでフラスコを使用しています。私はいくつかのデータをhtmlから.pyファイルに送る2つのajaxを持っています。SQLite:データベースがロックされています

これらの2つの操作のいずれかを実行するたびに問題が発生し、2つ目の操作はdbのロックのために使用できなくなります。また、最初に選択されたアクションが削除される場合は、その後に選択される操作に関係なく例外が発生します。追加の最初の選択では、機能が似ているので、奇妙な制限なしで追加することができます。

私はタイムアウトを試みましたが、セッションを別の方法で閉じると、結果は常に同じです。ここで

は2つの機能-ハンドラです:

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を持っている)すべてのfinallyブロックで。私は問題がdb = SQLAlchemy(app)のためにあるかもしれないと思うが、私はそれが事実である場合修正する方法を知らない。私はこの変数を使用して、フォームテンプレートを持つforms.pyの中のdbと、db内のテーブルを定義したmodels.pyに接続します。

答えて

0

したがって、よく、テテは接続数の問題でした。ただ

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

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() 

とハンドラで今では正常に動作しますが、私はまだない:私の問題を解決し 事はSQLAlchemyのためのコンテキストマネージャだった、私はこの1つを使用しました以前のバージョンの問題が何だったかを知ってください。彼らはコンテクストマネージャの有無にかかわらず同じように見える

関連する問題