如何在 SQL heredoc 中使用 sql IN 查询
How to use sql IN query in SQL heredoc
我想在 SQL heredoc 中使用数组常量,例如:
ROLES = ['admin', 'staff', 'guest']
query = <<-SQL
SELECT * FROM users
WHERE role IN (#{ROLES})
SQL
ActiveRecord::Base.connection.execute(query)
但出现语法错误
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "["
LINE 2: WHERE role IN (["admin", "staff", "guest"])
^
而不是传递 ROLES.inspect
的结果,你应该自己制作带有角色的字符串,我会为此目的使用 map
和 join
:
query = <<-SQL
SELECT * FROM users
WHERE role IN (#{ROLES.map { |role| "'#{role}'" }.join(',')})
SQL
ApplicationRecord.connection.execute(query)
除了构建自己的 Ruby 到 SQL 转换器之外,您还可以使用 arel gem,它已经完成了必要的转义和引用。
users = User.arel_table
ApplicationRecord.connection.execute(<<~SQL.squish)
SELECT *
FROM users
WHERE #{users[:role].in(ROLES).to_sql}
SQL
或者如果你想去完整的区域。
ApplicationRecord.connection.execute(
users.project(users[Arel.star])
.where(users[:role].in(ROLES))
.to_sql
)
我想在 SQL heredoc 中使用数组常量,例如:
ROLES = ['admin', 'staff', 'guest']
query = <<-SQL
SELECT * FROM users
WHERE role IN (#{ROLES})
SQL
ActiveRecord::Base.connection.execute(query)
但出现语法错误
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "["
LINE 2: WHERE role IN (["admin", "staff", "guest"])
^
而不是传递 ROLES.inspect
的结果,你应该自己制作带有角色的字符串,我会为此目的使用 map
和 join
:
query = <<-SQL
SELECT * FROM users
WHERE role IN (#{ROLES.map { |role| "'#{role}'" }.join(',')})
SQL
ApplicationRecord.connection.execute(query)
除了构建自己的 Ruby 到 SQL 转换器之外,您还可以使用 arel gem,它已经完成了必要的转义和引用。
users = User.arel_table
ApplicationRecord.connection.execute(<<~SQL.squish)
SELECT *
FROM users
WHERE #{users[:role].in(ROLES).to_sql}
SQL
或者如果你想去完整的区域。
ApplicationRecord.connection.execute(
users.project(users[Arel.star])
.where(users[:role].in(ROLES))
.to_sql
)