【问题标题】:Flask SQLAlchemy IntegrityError "UNIQUE constraint failed" when trying to update values尝试更新值时 Flask SQLAlchemy IntegrityError“UNIQUE 约束失败”
【发布时间】:2019-06-21 09:10:20
【问题描述】:

我有一个带有用户身份验证系统的烧瓶网站。 当我尝试将更改提交到数据库时出现错误。

class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
surname = db.Column(db.String)
email = db.Column(db.String, unique=True)
password = db.Column(db.String)
registered_on = db.Column(db.DateTime)
admin = db.Column(db.Boolean)
avatar = db.Column(db.String)
confirmed = db.Column(db.Boolean)
confirmed_on = db.Column(db.DateTime)

cloud_storage_actived = db.Column(db.String)

def __init__(self, name=None, surname=None, email=None, password=None, user_id=None, confirmed=None, confirmed_on=None, admin=False, avatar='/static/avatars/default.png', cloud_storage_actived=False):
    self.id = user_id
    self.name = name
    self.surname = surname
    self.email = email
    self.password = password
    self.admin = admin
    self.avatar = avatar
    self.confirmed = confirmed
    self.confirmed_on = confirmed_on
    self.registered_on = datetime.datetime.now()

    self.cloud_storage_actived = cloud_storage_actived

def is_authenticated(self):
    return True
user = User.query.filter_by(email=current_user.email).first_or_404()
user.query.update(dict(name=request.form['name'], 
surname=request.form['surname'], email=request.form['email'], avatar=url_for('static', filename='avatars/') + filename if filename else current_user.avatar))
db.session.commit()
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: user.email
[SQL: UPDATE user SET name=?, surname=?, email=?, avatar=?]
[parameters: ('MyName', 'MySurname', 'MyEmail', '/static/avatars/1.gif')]
(Background on this error at: http://sqlalche.me/e/gkpj)

我在网上搜索了如何做到这一点,但我没有找到答案。

【问题讨论】:

  • 您确定数据库中没有该电子邮件的记录?
  • @RonNabuurs 是的。

标签: python python-3.x flask flask-sqlalchemy flask-login


【解决方案1】:

这是因为您将所有用户记录更新为相同的值。您的查询应该有一个 where 语句。

您正在运行的查询是

UPDATE user SET name='MyName', surname='MySurname', email='MyEmail', avatar='/static/avatars/1.gif'

但实际上应该是这样的:

UPDATE user SET name='MyName', surname='MySurname', email='MyEmail', avatar='/static/avatars/1.gif' WHERE id = someid

您应该只使用 where 语句更新一个用户:

user = User.query.filter_by(email=current_user.email).first_or_404()
user.query.update(dict(name=request.form['name'], surname=request.form['surname'], email=request.form['email'], avatar=url_for('static', filename='avatars/') + filename if filename else current_user.avatar)).where(User.email == current_user.email)
db.session.commit()

但是因为你使用的是模型,所以你也可以更新模型

user = User.query.filter_by(email=current_user.email).first_or_404()
user.name = request.form['name']
user.surname = request.form['surname']
user.email = request.form['email']
user.avatar = url_for('static', filename='avatars/') + filename if filename else current_user.avatar
db.session.flush()
db.session.commit()

【讨论】:

    猜你喜欢
    • 2016-12-22
    • 2021-06-29
    • 2021-12-09
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2018-11-17
    相关资源
    最近更新 更多