Python Flask catch IntegrityError不起作用

时间:2016-06-15 10:58:26

标签: python python-2.7 flask sqlalchemy

我有一个表单,用户可以通过multiselect上传一个或多个图像。这些图像属于一个房间。图像存储在服务器上的静态文件夹中。在数据库中,我保存了“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。我试图只提供相关的代码片段。 Hoope有人可以帮助我处理这个问题。感谢

修改

如果我移动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)]

1 个答案:

答案 0 :(得分:0)

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

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