2017-05-03 4 views
1

I User-Modell haben, die, wie unten beschrieben wird: -Sql-Alchemie Integritätsfehler

class User(db.Model, object): 
    __tablename__ = "users" 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(15), unique=True) 
    email = db.Column(db.String(50), unique=True) 
    password = db.Column(db.String(80)) 

    def is_authenticated(self): 
     return True 

    def is_active(self): 
     return True 

    def get_id(self): 
     return unicode(self.id) 

Jetzt habe ich ein Anmeldeformular, das wie nachstehend beschrieben: -

class RegisterForm(Form): 
    email = StringField('email', validators=[InputRequired(), Email(message='Invalid email'), Length(max=50)]) 
    username = StringField('username', validators=[InputRequired(), Length(min=4, max=15)]) 
    password = PasswordField('password', validators=[InputRequired(), Length(min=8, max=80)]) 

jetzt ist das Problem,

Wenn ich mich über Web-App registriere/registriere, wird die ID automatisch erhöht und ein neuer Benutzer wird erstellt. Also habe ich user1 mit id1 erstellt, das automatisch von sql-alchemy über das Registrierungsformular zugewiesen wird.

Jetzt verwende ich insert-Anweisung in der Datenbank, um einen neuen Benutzer mit einer gültigen ID einzufügen. Also habe ich user2 mit id2 durch insert-Anweisung in der Datenbank erstellt.

Wenn ich versuche, user3 durch Web-App zu erstellen, zeigt es sqlalchemy.exc.IntegrityError IntegrityError: (psycopg2.IntegrityError) doppelte Schlüsselwert verletzt eindeutige Einschränkung "users_pkey" DETAIL: Taste (id) = (2) ist bereits vorhanden.

Jetzt wieder wenn ich versuche, mich mit user3 anzumelden, erstellt es einen neuen Benutzer.

Ich versuchte mit Autoload Flask über aktuelle ID wissen, aber es funktioniert nicht.

+2

Sie die ID explizit festlegen könnte zu erhöhen, wie so: 'id = db.Column (db.Integer, primary_key = True, autoincrement = True)' – Cicero

+0

Es funktioniert nicht, indem autoincrement = True. Es wird inkrementiert, wenn ich es nach dem Fehler erneut versuche. –

+0

Haben Sie nach dem Hinzufügen von '..., autoincrement = True' die Änderungen in Ihrer DB übernommen? Das passiert nicht automatisch, Sie müssen vorhandene DBs irgendwie migrieren, d. H. Ihre Integer-Primärschlüsselspalte in eine serielle ändern. –

Antwort

1

Ein Hack würde die maximale ID aus der ID-Spalte abfragen und um 1 erhöhen und sie dem neuen Benutzer zuweisen, um eine Primärschlüssel-Kollision zu verhindern.

max_id = session.query(User).order_by(User.id.desc()).first() 
new_user = User(id=max_id+1, email=form.email.data, username=form.username.data, password=hashed_password) 
db.session.add(new_user) 
db.session.commit() 
0

Verwenden Sie einfach eine Sequenz zu Autoinkrement Ihre ID.

from sqlalchemy import Integer, Sequence 

id = Column(Integer, Sequence('id_seq'), primary_key=True) 
+0

Erhalte den gleichen Fehler nach dem Einfügen der Datenbank. –

+1

Haben Sie das Schema neu erstellt? Stellen Sie sicher, dass die Sequenz erstellt wurde. – ScR4tCh

Verwandte Themen