python - flask-sqlachemy中如何处理插入的记录在数据库中已存在的问题?
高洛峰
高洛峰 2017-04-17 17:36:03
[Python讨论组]

表定义如下,

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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(5)
黄舟

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

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()
PHPz

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号