【问题标题】:FLASK-WTF update a unique column PYTHON/FLASK/SQLITEFLASK-WTF 更新唯一列 PYTHON/FLASK/SQLITE
【发布时间】:2021-06-06 12:19:13
【问题描述】:

def clean_clean 电子邮件不起作用。这个函数应该做两件事,如两个 if 所示。第一个检查是否没有对字段进行更改,如果没有进行任何更改,则验证不会开始,这目前有效。第二个 if 应该检查输入的电子邮件是否已经存在,如果存在则显示验证错误消息。第二个如果没有,如果输入现有电子邮件,这会导致 SQL IntegrityError。

Model.py - 表格

class User(db.Model, TimestampMixin, UserMixin):
    __tablename__ = 'user'
    __table_args__ = {'extend_existing': True}
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), nullable=False, unique=True)
    email = db.Column(db.String(80), nullable=False, unique=True)
    password_hash = db.Column(db.String(128))
    first_name = db.Column(db.String(20), nullable=False)
    last_name = db.Column(db.String(20), nullable=False)

forms.py

   class EditUserForm(FlaskForm):
    first_name = StringField('First Name', validators=[DataRequired()])
    last_name = StringField('Last Name', validators=[DataRequired()])
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    password2 = PasswordField(
        'Repeat Password', validators=[DataRequired(), EqualTo('password')])
    update = SubmitField('Update')
    cancel = SubmitField('Cancel')

    def clean_email(self):
        cd = self.cleaned_data
        email = cd(email=email.data)

        # if email is not modified, so don't start validation flow
        if self.instance.pk is not None and self.instance.email == email:
            return cd

        # check email is unique or not
        if User.objects.filter(email=email).exists():
            raise ValidationError("Email address already exists!".format(email))
        return cd
      

输入现有电子邮件时出现 SQL 错误

sqlite3.IntegrityError: UNIQUE constraint failed: user.email

【问题讨论】:

  • 能否提供更多细节,例如 SQL 错误?

标签: python sqlite flask


【解决方案1】:

关于列出的这个错误:

sqlite3.IntegrityError: UNIQUE 约束失败:user.email

这意味着您正在尝试使用已存在的电子邮件将新条目保存到“用户”表中。您的 models.py 文件中必须有类似

的约束
email = db.Column(db.String(120), unique=True, nullable=False)

如果您希望用户能够保存已被其他用户使用的电子邮件,那么您需要将其更改为...

email = db.Column(db.String(120), unique=False, nullable=False)

我不清楚您要做什么,但是如果您想查询电子邮件是否被当前用户以外的其他人使用,您可以执行以下操作:

email_already_in_use_boolean = bool(db.session.query(User).filter(User.email==email.data).filter(User.id!=current_user_id).first())

【讨论】:

  • 这个答案对您有帮助吗?
猜你喜欢
  • 2016-04-22
  • 1970-01-01
  • 2023-03-06
  • 2018-03-13
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多