Sequel ORM 中的 SQL 语法指南
sequel Sequel: The Database Toolkit for Ruby 项目地址: https://gitcode.com/gh_mirrors/seq/sequel
前言
Sequel 是一个强大的 Ruby ORM 框架,它提供了两种操作数据库的方式:一种是使用 Sequel 自带的 DSL(领域特定语言),另一种是直接使用原生 SQL。本文将重点介绍如何在 Sequel 中高效地使用 SQL,以及如何将常见的 SQL 表达式转换为 Sequel 的 DSL 语法。
直接使用 SQL
SELECT 查询
在 Sequel 中执行 SELECT 查询最推荐使用 Database#fetch
方法:
DB.fetch("SELECT * FROM albums") do |row|
puts row[:name]
end
这种方式支持占位符参数,既可以使用位置占位符(?),也可以使用命名占位符(:name):
# 位置占位符
DB.fetch("SELECT * FROM albums WHERE name LIKE ?", 'A%')
# 命名占位符
DB.fetch("SELECT * FROM albums WHERE name LIKE :pattern", pattern: 'A%')
延迟执行查询
Sequel 允许你将查询定义和执行分开:
ds = DB["SELECT * FROM albums"]
# 稍后执行
ds.each { |r| puts r[:name] }
其他查询方法
除了 each
,Sequel 还提供了多种结果处理方法:
DB["SELECT * FROM albums"].all # 返回所有记录为数组
DB["SELECT * FROM albums"].first # 返回第一条记录
增删改操作
对于 INSERT、UPDATE 和 DELETE 操作,Sequel 提供了简洁的语法:
# INSERT
DB["INSERT INTO albums (name) VALUES (?)", 'RF'].insert
# UPDATE
DB["UPDATE albums SET name = ? WHERE name = ?", 'MO', 'RF'].update
# DELETE
DB["DELETE FROM albums WHERE name = ?", 'MO'].delete
其他 SQL 操作
对于 DDL 语句(如 CREATE TABLE、ALTER TABLE 等),可以使用 Database#run
或 Database#<<
:
DB.run "CREATE TABLE albums (id integer primary key, name varchar(255))"
DB << "ALTER TABLE albums ADD COLUMN copies_sold INTEGER"
SQL 与 DSL 混合使用
Sequel 允许你在 DSL 中嵌入原生 SQL:
DB[:albums].select(Sequel.lit('name')) # 使用 Sequel.lit 包装原生 SQL
SQL 表达式转换指南
标识符处理
在 Sequel 中,SQL 标识符通常用 Ruby 符号表示:
:column # 转换为 "column"(带引号)
对于带表名前缀的列名,有几种表示方式:
Sequel[:table][:column] # "table"."column"
Sequel.qualify(:table, :column) # "table"."column"
数据类型映射
基本数据类型的映射非常直观:
1 # 整数 → 1
1.5 # 浮点数 → 1.5
'text' # 字符串 → 'text'
nil # NULL 值 → NULL
条件表达式
Sequel 使用 Ruby 哈希来表示 SQL 条件:
{column: 1} # "column" = 1
{column: [1, 2, 3]} # "column" IN (1, 2, 3)
{column: nil} # "column" IS NULL
否定条件可以使用 Sequel.~
或 Sequel.negate
:
Sequel.~(column: 1) # "column" != 1
Sequel.~(column: [1,2,3]) # "column" NOT IN (1, 2, 3)
比较运算符
Sequel 支持所有标准的比较运算符:
Sequel[:column] > 1 # "column" > 1
Sequel[:column] <= 10 # "column" <= 10
逻辑运算符
AND 和 OR 逻辑可以使用 &
和 |
运算符:
(Sequel[:a] > 1) & (Sequel[:b] < 2) # ("a" > 1) AND ("b" < 2)
(Sequel[:a] == 1) | (Sequel[:b] == 2) # ("a" = 1) OR ("b" = 2)
数学运算
基本的数学运算也得到支持:
Sequel[:column] + 1 # "column" + 1
Sequel[:column] * 2 # "column" * 2
函数调用
SQL 函数可以通过多种方式调用:
Sequel.function(:count, :column) # count("column")
DB[:table].select { sum(:column) } # SELECT sum("column") FROM "table"
窗口函数
窗口函数是 Sequel 的高级功能之一:
DB[:table].select { row_number.function.over(partition: :category, order: :date) }
# SELECT row_number() OVER (PARTITION BY category ORDER BY date) FROM table
调试 SQL
要查看 Sequel 实际生成的 SQL,可以使用 Database#literal
方法:
DB.literal(Sequel[:column] > 1) # => "\"column\" > 1"
或者设置数据库日志记录器:
DB.loggers << Logger.new($stdout)
结语
Sequel 提供了灵活的方式来处理 SQL 查询,无论是直接使用原生 SQL 还是使用 DSL。通过本文介绍的各种技术,你可以根据具体场景选择最适合的方式。对于简单的查询,DSL 提供了更 Ruby 化的语法;而对于复杂的查询,原生 SQL 可能更直观。掌握这两种方式的转换,将使你在使用 Sequel 时更加得心应手。
sequel Sequel: The Database Toolkit for Ruby 项目地址: https://gitcode.com/gh_mirrors/seq/sequel
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考