【问题标题】:Python Flask catch IntegrityError doesnt workPython Flask 捕获 IntegrityError 不起作用
【发布时间】:2016-10-16 10:54:33
【问题描述】:

我有一个表单,用户可以通过多选上传一张或多张图片。这些图像属于一个房间。图像存储在服务器上的静态文件夹中。在数据库中,我将图像的路径保存在“pfad”属性中。我分配给pfad属性unique=True,因为每个图像都应该被识别,因为不同的用户可能会将图像命名为相同方式。

在我的models.py(SQLalchemy)中有一个Bild类,这是属性:

pfad = Column(Text, nullable=False, unique=True)

如果图像名称不同,一切正常,但如果抛出 IntegrityError,我的代码将无法处理它。我的想法是:如果发生 IntegrityError,我会拆分文件名并为其添加一个数字,因此 pfad 将是一个不同的:

我的静态文件夹中有 fun.jpg 的图像,有人上传了另一个名为 fun.jpg 的图像 -> 我的代码应该“有趣”+“1”。 + "jpg" -> fun1.jpg 然后保存。但我仍然得到 IntegrityErrors。

我就是这样做的:

images = request.files.getlist("bild")   
if new_zimmer:
            db_session.add(new_zimmer)
            db_session.commit()

            for img in images:
                filename = secure_filename(img.filename)
                try:
                    print "file existiert nicht"
                    img.save(UPLOAD_FOLDER + filename)
                    new_bild = Bild(pfad=filename, zimmer_id=new_zimmer.id)
                    db_session.add(new_bild)

                except IntegrityError:
                    print "file existiert"
                    filename_list = filename.split(".")
                    new_filename = filename_list[0] + "1." + filename_list[1]
                    img.save(UPLOAD_FOLDER + new_filename)
                    new_bild = Bild(pfad=new_filename, zimmer_id=new_zimmer.id)
                    db_session.add(new_bild)

                db_session.commit()

相关部分从for img in images 开始。我试图只提供相关的代码片段。希望有人可以帮助我处理这个问题。谢谢

编辑:

如果我将 db_session.commit() 向上移动,我会收到此错误:

try:
                print "file existiert nicht"
                img.save(UPLOAD_FOLDER + filename)
                new_bild = Bild(pfad=filename, zimmer_id=new_zimmer.id)
                db_session.add(new_bild)
                db_session.commit()


            #else:
            except IntegrityError:
                print "file existiert"
                filename_list = filename.split(".")
                new_filename = filename_list[0] + "1." + filename_list[1]
                img.save(UPLOAD_FOLDER + new_filename)
                new_bild = Bild(pfad=new_filename, zimmer_id=new_zimmer.id)
                db_session.add(new_bild)
                db_session.commit()

错误:

sqlalchemy.exc.InvalidRequestError
InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (sqlite3.IntegrityError) column pfad is not unique [SQL: u'INSERT INTO bilder (pfad, zimmer_id) VALUES (?, ?)'] [parameters: ('zimmer2_01.jpg', 11)]

【问题讨论】:

  • 你不应该在 db_session.add(new_blind) 之后立即提交吗?
  • 我也试过了,还是一样的错误
  • InvalidRequest 因为 IntegrityError
  • 什么情况下可以InvalidRequest?
  • 我拙见的错误是您正在等待引发异常,为什么不先用 if 语句检查它。

标签: python python-2.7 flask sqlalchemy


【解决方案1】:

您的代码是否包含完整性错误的定义?

这可能会有所帮助: 从 sqlalchemy.exc 导入 IntegrityError

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2019-09-10
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多