2017-05-03 80 views
1

我有描述如下用戶模型: -SQL的鍊金完整性錯誤

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) 

現在我有其被描述爲低於登記表: -

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)]) 

現在的問題,

當我通過網絡應用程序註冊/註冊時,ID會自動遞增並創建一個新用戶。所以我創建了user1,id1通過註冊表單由sql-alchemy自動分配。

現在我在數據庫中使用插入語句插入一個新的用戶與一個有效的ID。所以我通過在數據庫中插入語句創建了id2的user2。

如果我嘗試創建通過web應用程序用戶3,它顯示sqlalchemy.exc.IntegrityError IntegrityError:(psycopg2.IntegrityError)重複鍵值違反唯一約束 「users_pkey」 詳細信息:按鍵(ID)=(2 ) 已經存在。

現在再次如果我嘗試使用user3註冊,它會創建一個新用戶。

我嘗試使用自動加載,使燒瓶知道最近的ID,但它不工作。

+2

您可以將ID設置爲明確增加,像這樣:'ID = db.Column' – Cicero

+0

它不是由包括自動增量=真正的工作(db.Integer,primary_key = True時,自動增量= TRUE)。如果在出現錯誤後再次嘗試,它正在遞增。 –

+0

在添加'...,autoincrement = True'後,您是否將更改應用於數據庫?這不會自動發生,您必須以某種方式遷移現有的數據庫,即將您的整數主鍵列更改爲序列。 –

回答

1

黑客將查詢id列中的最大id並將其增加1並將其分配給新用戶以防止主鍵衝突。

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

只需使用序列自動遞增您的ID。

from sqlalchemy import Integer, Sequence 

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

數據庫插入後得到相同的錯誤時,它工作正常。 –

+1

您是否重新創建了架構?確保序列已創建。 – ScR4tCh