sql - 将经过身份验证的用户信息传递给 sql 查询的最佳方法是什么?
问题描述
我的 Web 应用程序使用了一个表users
,posts
和votes
,用户可以在其中创建一个帖子,并且该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包与实现上下文的细节更加隔离?
解决方案
在 a 中隐藏基本数据context.Context
不是一个好主意。它消除了明确性、可读性,并且很难知道数据是否真的存在于上下文中。
context.Context
但是,如果由于某种原因您不再需要结果(例如,http 请求被取消/超时),您可以向函数添加一个以设置超时或取消它。
func (m *PostModel) GetByID(ctx context.Context, loggedInUserID, postID int) (*models.Post, error)
然后将上下文传递给查询执行。
推荐阅读
- javascript - “firebase/app”不包含默认导出(导入为“firebase”)
- php - PHPSpreadsheet 不适用于 PHP 版本 7.3.26
- sql - 如何在不分词的情况下将文本分成三列
- python - 通过特定单词从列表中提取字符串
- javascript - 使用reduce方法对对象数组中的值求和并查找重复项 - JS
- spring-boot - 如何在 gelf 中更改 DynamicMdcFields 的名称
- sql - 将大文本拆分为单独行中的块
- google-bigquery - 嗨,谁能帮我在 Google 的 Bigquery 中找到 next_day 函数的替代方法?
- sql - SQL 根据不同的可空列过滤掉
- git - 构建 Git 存储库的良好实践