Sequel ORM 中的 SQL 语法指南

Sequel ORM 中的 SQL 语法指南

sequel Sequel: The Database Toolkit for Ruby sequel 项目地址: 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#runDatabase#<<

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 sequel 项目地址: https://gitcode.com/gh_mirrors/seq/sequel

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

褚铃尤Kerwin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值