(澳门银河官网) flask-sqlachemy中如何处理插入的记录在数据库中已存在的问题?
澳门银河官网
澳门银河官网
当前位置 : 澳门银河官网 > 澳门银河官网

(澳门银河官网) flask-sqlachemy中如何处理插入的记录在数据库中已存在的问题?

表定义如下,

class Userdb.Model:
    __tablename__ = ausers
    id = db.Columndb.Integer, primary_key=True
    username = db.Columndb.String64, unique=True, index=True
    role_id = db.Columndb.Integer, db.ForeignKeyroles.id
    sex = db.Columndb.String64
    def __repr__self:
        return <User %r> % self.username

在数据中已经有一条username字段为susan的记录,
再运行以下语句

user_susan = Userusername=susan
db.session.add_all[user_susan]
db.session.commit

会报错

IntegrityError: _mysql_exceptions.IntegrityError 1062, "Duplicate entry susan for key ix_ausers_username" [SQL: uINSERT INTO ausers username, role_id, sex VALUES %s, %s, %s] [parameters: susan, None, None]

怎么处理这种插入重复记录时的问题,每次插入前都需要先读一遍已有的记录吗?

与数据库交互这种会抛异常的地方一定要捕获异常,然后再根据情况处理,不需要每次先读先判断,你的代码可以改成这样:

try:
    user_susan = Userusername=susan
    db.session.add_all[user_susan]
    db.session.commit
except IntegrityError as e:
    # Do something
else:
    # Do something
finally:
    # Do something

关于try, except, else, finally的基本语法不多赘述,总之牢记:会报异常的地方一定要捕获。
这是编码习惯问题。

捕获 IntegrityError 异常,有异常跳过

虽然一楼是正解,但是在生产环境中,还是get一次判断是否存在已有username,因为IntegrityError异常并不一定是username字段抛出的异常

使用 session.merge 方法替代 session.add,其实就是 SELECT + UPDATE:

user = Userid=1, name=ooxx
session.mergeuser
session.commit

username中的unique去掉就好了,这样就不会检查一致性了。

栏目列表

广告位

澳门银河官网