2017-08-10 18 views
0

にコミットされません私は、ドキュメントのかなりを読んでいると私はこれらの線更新状態は、データベース

update_this = User.query.filter_by(email=email).first() 
update_this.emailconfirmed = True 
db.session.commit() 

と間違っているものを見ることができない...とブール値の列 'emailconfirmed'は決してTrueに更新されません。私は上記のコードの正確な時点でupdate_this.emailconfirmedがFalseであることを印刷文で確認しました...私はその値を更新できないようです。今、これは上記のコードは

from flask import Flask, render_template, request, session, redirect, url_for, make_response 
# the following line imports from models.py 
from models import db, User 
# the following line imports SignupForm from forms.py 
from forms import SignupForm, LoginForm 
from flask_mail import Mail, Message 
from itsdangerous import URLSafeTimedSerializer 

# Production (causes Heroku to redirect to SSL) 
from flask_sslify import SSLify 
from flask_sqlalchemy import SQLAlchemy 


import os 
app = Flask(__name__) 
sslify = SSLify(app) 
sslify = SSLify(app, subdomains=True) 
app.config.from_pyfile('config_file.cfg') 
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URL'] 
db = SQLAlchemy(app) 
mail = Mail(app) 
ts = URLSafeTimedSerializer(app.config['SECRET_KEY'], salt=app.config['SALT']) 

を表示され、これが私である私のメインの.pyファイルの先頭である

など私はなどをチェックする必要がありますどのような輸入、私は何ができるかをテスト誰を知っていますmodels.pyファイル

from flask_sqlalchemy import SQLAlchemy 
from werkzeug import generate_password_hash, check_password_hash 


db = SQLAlchemy() 

class User(db.Model): 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key=True) 
    firstname = db.Column(db.String(100)) 
    lastname = db.Column(db.String(100)) 
    role = db.Column(db.String(20)) 
    roleapproved = db.Column(db.Boolean) 
    school = db.Column(db.String(100)) 
    email = db.Column(db.String(120), unique=True) 
    emailconfirmed = db.Column(db.Boolean) 
    pwdhash = db.Column(db.String(100)) 


    def __init__(self, firstname, lastname, role, school, email, password): 
     self.firstname = firstname.title() 
     self.lastname = lastname.title() 
     self.role = role.lower() 
     if role.lower() == 'student': 
      self.roleapproved = True 
     if role.lower() == 'teacher': 
      self.roleapproved = False 
     self.school = school.title() 
     self.email = email.lower() 
     self.set_password(password) 
     self.emailconfirmed = False 

    def set_password(self, password): 
     self.pwdhash = generate_password_hash(password) 

    def check_password(self, password): 
     return check_password_hash(self.pwdhash, password) 

    def __repr__(self): 
     return '<User {0}>'.format(self.email) 

私が上記の更新を行う上での助けに感謝します! main.py

+0

適切な解決策は、2つのセパレータを持たないことです'db'のインスタンスです。あなたのモデルは、アプリケーションで定義されたモデルをインポートする必要があります。 –

答えて

0

Ideally you want to maintain a single session throughout your application lifecycle. This way it makes it easy to reason about and you avoid binding sessions to individual models.

おかげ@Ilja Everila

代わりにあなたが書くべきSQLAlchemy を初期化する、

db.init_app(app) 

あなたのUserモデル用saveインスタンスメソッドを定義します。

def save(self): 
    """Saves model object instance 
    """ 
    db.session.add(self) 
    db.session.commit() 

あなたはエンティティを更新するための別の方法は、

from sqlachemy.orm import session 
... 
session = session.object_session(update_this) 
session.commit() 

をコミットする前に、特定のオブジェクトのセッションを取得することです

update_this.save() 

としてインスタンスを保存するには、このメソッドを呼び出すことができます

+0

私はエラーが発生しました。 'sqlalchemy.exc.InvalidRequestError:オブジェクト '<0x7efd1d881710>のユーザー'がすでにセッション '1'(これは '2')に接続されています ' – okcapp

+0

コードに2つのセッションがあります。 1つはあなたの 'models.py'にあり、もう1つはあなたがクエリを作成した場所です。 _session 1_を取得し、それを明示的にコミットするか、 'models.py'で宣言されたセッションを使用するインスタンスメソッドを定義する必要があります。私は後で行うために私の答えを更新しました。 –

+0

それはうまくいった。ありがとう!!! – okcapp

関連する問題