Почему flask sql alchemy не обновляет атрибут для записи?
У меня есть класс, показанный ниже:
class Account(db.Model, flask_login.UserMixin):
__tablename__ = 'account'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(75))
username = db.Column(db.String(50))
password = db.Column(db.String(250))
admin = db.Column(db.Boolean)
def __init__(self, email='', username='', password='', admin=None):
self.email = email
self.username = username
self.password = password
self.admin = admin
def __repr__(self):
return '<Account %r>' % self.username
Когда я создаю учетную запись через форму, атрибут admin будет None
. Однако, когда я обращаюсь к базе данных и пытаюсь вручную установить его в True
, атрибут будет обновляться, но когда я снова обращаюсь к базе данных, атрибут None
это очень раздражает.
Вот что я выполняю на консоли:
account = Account.query.get(1)
account.admin = True
db.session.commit()
db.admin ----> True
exit()
#restart again
account = Account.query.get(1)
account.admin ----> None
Что я делаю не так?
2 ответа:
Просто сделайте это:
account = Account.query.get(1) account.admin = True db.session.merge(account) db.session.commit()
Изменения будут обнаружены и отправлены в базу данных.
Экземпляр, который у вас есть, и объект в сеансе не обязательно являются одним и тем же - несмотря на то, что они представляют одну и ту же вещь, они не являются одним и тем же объектом. В Flask-SqlAlchemy есть конфигурация SQLALCHEMY_TRACK_MODIFICATIONS, которая заставляет sqlalchemy работать так, как вы хотите. Но это очень дорого, так как orm должен будет отслеживать изменения, сделанные на всех ваших экземплярах.
Надеюсь, что это помогает!