如何在SQLAlchemy,flask,pyhon中处理唯一数据
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在SQLAlchemy,flask,pyhon中处理唯一数据,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1914字,纯文字阅读大概需要3分钟。
内容图文
![如何在SQLAlchemy,flask,pyhon中处理唯一数据](/upload/InfoBanner/zyjiaocheng/895/857b67ed687e48629caf212729d28c63.jpg)
你如何处理Flask中的唯一数据库条目?我的db模型中有以下列:
bank_address = db.Column(db.String(42), unique=True)
问题是,即使在我可以检查它是否已经在数据库中之前,我收到一个错误:
检查它是否是唯一的,然后写入db:
if request.method == 'POST':
if user.bank_address != request.form['bank_address_field']:
user.bank_address = request.form['bank_address_field']
db.session.add(user)
db.session.commit()
我得到的错误:
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE
constraint failed: user.bank_address_field [SQL: ‘UPDATE user SET
bank_address_field=? WHERE user.id = ?’]
解决方法:
你可以做两件事之一:
>对具有该字段的用户进行查询:
if User.query.filter(User.bank_address == request.form['bank_address_field']).first():
# error, there already is a user using this bank address
这有一个很大的问题,但是,见下文.
>抓住例外:
from sqlalchemy.exc import IntegrityError
try:
db.session.commit()
except IntegrityError:
db.session.rollback()
# error, there already is a user using this bank address or other
# constraint failed
其中IntegrityError可以从sqlalchemy.exc导入.一旦引发IntegrityError,无论您是否捕获到错误,您正在使用的会话都将失效.要继续使用该会话,您需要发出db.session.rollback().
后者更好,因为它不受竞争条件的影响.想象一下,两个用户同时尝试注册相同的银行地址:
>用户A提交,User.query.filter().first()返回None,因为还没有人使用该地址.
>几乎在同一时间,用户B提交,User.query.filter().first()返回None,因为没有人正在使用该地址.
>用户A的银行地址已成功写入数据库
>用户B的银行地址无法写入数据库,因为完整性检查失败,因为用户A刚刚记录了该地址.
因此,只捕获异常,因为数据库事务保证数据库在测试约束和添加或更新用户之前首先锁定表.
您也可以在Flask中锁定整个表,但Python与数据库通信的速度要慢得多.如果您有一个繁忙的站点,您不希望数据库更新速度慢,最终会有很多用户等待锁定清除.您希望将锁定保持在最低限度,并且尽可能短,并且越靠近锁定的实际数据,您就可以越快地再次释放锁定.数据库非常擅长这种锁定,并且非常接近它们的数据(当然),因此将锁定保留在数据库中并依赖于异常.
内容总结
以上是互联网集市为您收集整理的如何在SQLAlchemy,flask,pyhon中处理唯一数据全部内容,希望文章能够帮你解决如何在SQLAlchemy,flask,pyhon中处理唯一数据所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。