sqlalchemy.exc.IntegrityError:(sqlite3.IntegrityError)唯一约束失败我该怎么办?

问题描述 投票:0回答:1

所以我创建了一个用户模型和一个表单类,以便在创建帐户时接收用户数据。但是当我提交时,会弹出一个完整性错误页面并显示下一个错误:

> sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE
> constraint failed: user.email_adress [SQL: INSERT INTO user (username,
> email_adress, password_hash, budget) VALUES (?, ?, ?, ?)] [parameters:
> ('erickkpruneda', '[email protected]', 'Guero432', 1000)]
> (Background on this error at: https://sqlalche.me/e/20/gkpj)

如您所见,这就是我在表单上输入的数据。更奇怪的是,当我检查数据时,数据实际上保存在数据库中,它包含所有用户、电子邮件和密码信息。所以我更困惑atp 继承人的代码: 路线代码

from market import app, db
from flask import render_template, redirect, url_for
from market.models import Item, User
from market.forms import RegisterForms




@app.route('/')   # decorator

def home_page():
    return render_template('home.html')

@app.route('/market')
def market():
    items = Item.query.all()
    return render_template('market.html', items = items)  



@app.route('/register', methods = ['GET', 'POST'])
def registerPage():
    form = RegisterForms()
   
    if form.validate_on_submit():
      
        user_to_create = User(username = form.username.data, email_adress = form.email.data, password_hash = form.password_1.data)
        
        db.session.add(user_to_create)
        db.session.commit()
        
      
        return redirect(url_for('market'))
    return render_template('register.html', form = form)

型号:

from market import db

class User(db.Model):
    id = db.Column(db.Integer(), primary_key = True)
    username = db.Column(db.String(length = 30), nullable = False, unique = True)  
    email_adress = db.Column(db.String(length = 50), nullable = False, unique = True)
    password_hash = db.Column(db.String(length = 60), nullable = False)
    budget = db.Column(db.Integer(), nullable = False, default = 1000)
    items = db.relationship('Item', backref = 'owned_user', lazy = True) 

    def __repr__(self) -> str:
        return f'User {self.username}'

和形式:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField

class RegisterForms(FlaskForm):
 
    username = StringField(label= 'Username: ')
    email = StringField(label= 'Email address: ')
    password_1 = PasswordField(label= 'Password:')
    password_2 = PasswordField(label= 'Confirm password: ')
    submit = SubmitField(label= 'Create account')
python database sqlite flask flask-sqlalchemy
1个回答
0
投票

尝试在 FlaskForm 的 validate 方法中进行电子邮件验证

class RegisterForm(FlaskForm):
   ...

   def validate(self, *args, **kwargs):
       rs = super().validate(*args, **kwargs)
       if rs:
           existing_email = User.query.filter(User.email_address == self.email).one_or_none()
           if existing_email:
               self.email.errors.append("Already exist")
               return False
       return rs
© www.soinside.com 2019 - 2024. All rights reserved.