H5W3
当前位置:H5W3 > 其他技术问题 > 正文

flask-sqlachemy中如何处理插入的记录在数据库中已存在的问题?

表定义如下,

class User(db.Model):
    __tablename__ = 'ausers'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    sex = db.Column(db.String(64))
    def __repr__(self):
        return '<User %r>' % self.username

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

user_susan = User(username='susan')
db.session.add_all([user_susan])
db.session.commit()

会报错

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

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

回答:

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

try:
    user_susan = User(username='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 = User(id=1, name='ooxx')
session.merge(user)
session.commit()

回答:

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

本文地址:H5W3 » flask-sqlachemy中如何处理插入的记录在数据库中已存在的问题?

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址