Почему 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 2

2 ответа:

Просто сделайте это:

account = Account.query.get(1)
account.admin = True
db.session.merge(account)
db.session.commit()

Изменения будут обнаружены и отправлены в базу данных.

Экземпляр, который у вас есть, и объект в сеансе не обязательно являются одним и тем же - несмотря на то, что они представляют одну и ту же вещь, они не являются одним и тем же объектом. В Flask-SqlAlchemy есть конфигурация SQLALCHEMY_TRACK_MODIFICATIONS, которая заставляет sqlalchemy работать так, как вы хотите. Но это очень дорого, так как orm должен будет отслеживать изменения, сделанные на всех ваших экземплярах.

Надеюсь, что это помогает!

Изменение объекта не добавляется в сеанс. Таким образом, правильный путь будет

account = Account.query.get(1)
account.admin = True
db.session.add(account)
db.session.commit()