5

我将 Sinatra 和 Sequel 与 PostgreSQL 一起使用。

身份验证后,我想通过打印用户名来欢迎用户,但我不能只从数据库中获取用户名的值,它以哈希的形式出现。

查询是:

current_user = DB[:users].select(:username).where('password = ?', password).first

得到的数据是:

Welcome, {:username=>"Rich"}

这看起来很奇怪,我更喜欢它读“Welcome, Rich”。

我在这里做错了什么?我最后尝试了相同的查询,但没有“第一”,这也不起作用。

4

2 回答 2

5

您可以从给定的哈希中提取您选择的(单个)列:

current_user = DB[:users].select(:username).where('password=?', password).first[:username]

或者,您可以将结果映射到用户名数组并提取第一个:

# Using a hash in the filter method is simpler than SQL placeholders.
current_user = DB[:users].filter(password:password).select_map(:username).first

但最好的方法是只获取你关心的用户,然后获取名称:

# Using [] on a dataset returns the first row matching the criteria
current_user = DB[:users][password:password][:username]
于 2013-06-13T05:01:21.930 回答
2

尝试 Sequel::Dataset#get。此外,正如 Phrogz 指出的那样,Sequel::Dataset#where 可以采用散列(它将安全地转义值以防止注入攻击)。

current_username = DB[:users].where(password: password).get(:username)

还有 Sequel::Dataset#where_single_value,它针对这种确切情况进行了优化:

current_username = DB[:users].select(:username).where_single_value(password: password)
于 2018-06-20T22:27:29.073 回答