Sqlalchemy使用flush()在这里检索智能主键(id)?

时间:2018-04-06 14:00:48

标签: python database postgresql sqlalchemy flush

我有一个用户可以上传图片/视频的表单。我为文件创建了一个独特的图像/视频名称,以确保名称是唯一的我使用图像/视频对象的id。要在我使用commit()的{​​{1}}之前获取ID。

flush()

效果很好,但这不会导致问题def profile_add_user_post(): form = AddUserPostForm() if form.validate_on_submit(): new_post = Post(title=form.title.data.strip(), description=form.description.data, created_on=datetime.today(), updated_on=datetime.today(), created_by_user_id=current_user.id) if form.visible_to_tier_id.data and form.visible_to_tier_id.data != "0": setattr(new_post, "visible_to_tier_id", form.visible_to_tier_id.data) if form.post_image.data: new_image_post = PostImage(path=get_random_code(15), created_on=datetime.today()) new_post.image_belongs_to_post_addresses.append(new_image_post) # multiple add db_session.add(new_post) db_session.flush() image_name = str(new_image_post.id) + "-post-image." + form.post_image.data.filename.split(".")[-1] upload_to_aws(image_name, "images/", form.post_image.data) setattr(new_image_post, "path", image_name) if form.post_video.data: new_video_post = PostVideo(path=get_random_code(15), created_on=datetime.today()) new_post.video_belongs_to_post_addresses.append(new_video_post) # multiple add db_session.add(new_post) db_session.flush() video_name = str(new_video_post.id) + "-post-video." + form.post_video.data.filename.split(".")[-1] upload_to_aws(video_name, "videos/", form.post_video.data) setattr(new_video_post, "path", video_name) if form.send_category.data: category_list_for_post = form.send_category.data.split(",") for cat in category_list_for_post: new_cat_post = PostBelongsCategory(category_id=cat) new_post.children_PostBelongsCategory.append(new_cat_post) # multiple add db_session.add(new_post) db_session.commit() flash("Beitrag erfolgreich hinzugefügt","success") return redirect(url_for('profile')) return render_template('profile_add_post.html', form=form)

视频上传可能需要几分钟时间。但是我在上传视频之前要求提供ID,以防其他用户同时上传视频。 IntegretyError可以使两个用户都拥有相同的视频ID,这会导致他们中的一个在上传视频时为flush()

这是我的例子中的一个问题吗?如果是,IntegretyError的用途是什么?我已经找到了一些相关的线索,但我还不是100%肯定。

此外如果flush()在这里没用,我怎样才能确保(最佳做法)文件名是唯一的?

我可以使用我的flush()作为文件名,这将生成一个随机字符串,两次生成相同字符串的几率几乎为0.这样我就不需要get_random_code(15)。但我没有更多的想法。

0 个答案:

没有答案