首页 > 解决方案 > 将经过身份验证的用户信息传递给 sql 查询的最佳方法是什么?

问题描述

我的 Web 应用程序使用了一个表users,postsvotes,用户可以在其中创建一个帖子,并且该votes表包含某个用户对某个帖子的单票(想想 Hackernews 或 Reddit)。

当使用 SQL 查询来自 的帖子时posts,我在 SQL 中创建了一个名为 的变量votable,表示 a) 如果帖子是由当前登录的用户(用 2 表示)发布的,已由登录用户投票(用0),或尚未投票(用 1 表示)。

变量创建看起来像这样,并传入登录用户的 id(如果未登录,则为 0):

IF(posts.user_id = ?, 2, NOT EXISTS (SELECT * FROM votes WHERE user_id = ? AND post_id = posts.id)) AS votable

在我的 sql 包中获取帖子的函数的签名是:

func (m *PostModel) GetByID(loggedInUserID, postID int) (*models.Post, error) 

但是,在我的处理程序中使用上下文是否有意义,因为上下文包含有关登录用户的信息?或者这样可以吗,处理程序只是将loggedInUserID直接传递给函数,而我的sql包与实现上下文的细节更加隔离?

标签: sqlgo

解决方案


在 a 中隐藏基本数据context.Context不是一个好主意。它消除了明确性、可读性,并且很难知道数据是否真的存在于上下文中。

context.Context但是,如果由于某种原因您不再需要结果(例如,http 请求被取消/超时),您可以向函数添加一个以设置超时或取消它。

func (m *PostModel) GetByID(ctx context.Context, loggedInUserID, postID int) (*models.Post, error)

然后将上下文传递给查询执行。


推荐阅读