2017-03-11 15 views
0

私のMysqlデータベースに 'select'クエリを実行することができます。 しかし、 "挿入"のものはデータベースを変更せず、Pythonオブジェクトのみを変更します。だから私はフラスコのアプリケーションを再起動すると、コミットされた(?)エディションはすべて消えてしまいました。更新はmysqlサーバflask-sqlalchemyでコミットされていません

再生回数:

from flask import Flask, render_template, request, redirect, url_for, flash, Response 
from sqlalchemy import exc 
from models import * 

app = Flask(__name__) 
app.config['DEBUG'] = True 
app.config['SECRET_KEY'] = 'kjhS7usfHGJHDez78' 
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqldb://admin:[email protected]:3306/grenier' 
app.config['SQLALCHEMY_ECHO'] = True 
db = SQLAlchemy(app) 

db.create_all() 

@app.route('/ajax/submit_edition', methods=['POST']) 
def submit_edition(): 
    if request.method == 'POST': 
     given_id=1 
     show = Shows.query.filter_by(id=given_id).first() 
     show.short_description = "Hello" 
     try: 
      db.session.commit() 
      db.session.flush() 
      return "ok" 
     except exc.SQLAlchemyError: 
      return "Error in commiting the edition" 

は特に例外が検出されませんでした。ルートは常に "ok"を返します。

モデル:私は、ログを見てみると

from sqlalchemy import Column, ForeignKey 
from sqlalchemy.dialects.mysql import LONGTEXT, YEAR 
from flask_sqlalchemy import SQLAlchemy 

db = SQLAlchemy() 


class Shows(db.Model): 
    __tablename__ = "shows" 

    id = Column(db.Integer, ForeignKey("programmation.id"), primary_key=True) 
    date = Column(db.DATETIME) 
    title = Column(db.VARCHAR(50)) 
    short_description = Column(db.VARCHAR(200)) 
    type = Column(db.VARCHAR(20)) 
    background_image = Column(db.VARCHAR(150)) 
    content = Column(LONGTEXT) 

    def serialize(self, whatTo): 
     result = {} 
     if 'id' in whatTo: 
      result['id'] = self.id 
     if 'date' in whatTo: 
      result['date'] = str(self.date) 
     if 'title' in whatTo: 
      result['title'] = self.title 
     if 'short_description' in whatTo: 
      result['short_description'] = self.short_description 
     if 'type' in whatTo: 
      result['type'] = self.type 
     if 'background_image' in whatTo: 
      result['background_image'] = self.background_image 
     if 'content' in whatTo: 
      result['content'] = self.content 
     return result 


class Programmation(db.Model): 
    __tablename__ = "programmation" 

    id = Column(db.Integer, primary_key=True) 
    semester = Column(db.Integer) 
    year = Column(YEAR) 

、SQL要求は、選択のために作成されます。しかし、insert commit()の場合、何もありません。

ありがとうございました!

答えて

0

問題は2つの異なるSQLAlchemyインスタンスの使用です。 db.create_all()メソッドを呼び出すと、db.Modelから継承したすべてのテーブルが作成されますが、ビューではdb = SQLAlchemy(app)から継承されたモデルはありません。すべてのモデルは他のSQLAlchemyインスタンスから継承されています。これを修正するにはdbオブジェクトをビューからモデルモジュールにインポートし、継承の親クラスとして使用してください。

#models.py 
from views import db 

#db = SQLAlchemy() #remove this line 
class Show(db.Model): 
    ... 
+0

完璧にありがとうございます。 –

+0

そのことをよく聞く;) – metmirr

関連する問題