【发布时间】: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