Sequel ORM 快速参考指南:数据库操作与查询技巧
sequel Sequel: The Database Toolkit for Ruby 项目地址: https://gitcode.com/gh_mirrors/seq/sequel
前言
Sequel 是一个功能强大的 Ruby ORM(对象关系映射)框架,提供了简洁而灵活的数据库操作接口。本文将为开发者提供 Sequel 的核心功能快速参考,帮助您快速上手和使用这个优秀的数据库工具。
数据库连接
基本连接方式
Sequel 支持多种数据库连接方式,语法简洁明了:
require 'sequel'
# SQLite 连接
DB = Sequel.sqlite('my_blog.db')
# PostgreSQL 连接
DB = Sequel.connect('postgres://user:password@localhost/my_db')
DB = Sequel.postgres('my_db', user: 'user', password: 'password', host: 'localhost')
# ADO 连接
DB = Sequel.ado('mydb')
内存数据库
SQLite 支持内存数据库,无需指定文件名:
DB = Sequel.sqlite # 创建内存数据库
日志记录
调试时查看执行的 SQL 语句非常有用:
require 'logger'
DB = Sequel.sqlite(loggers: [Logger.new($stdout)])
# 或者
DB.loggers << Logger.new($stdout)
基础 SQL 操作
执行原生 SQL
# 创建表
DB.run "CREATE TABLE users (name VARCHAR(255) NOT NULL, age INT(3) NOT NULL)"
# 带参数的查询
dataset = DB["SELECT age FROM users WHERE name = ?", name]
ages = dataset.map(:age)
# 遍历结果
DB.fetch("SELECT name FROM users") do |row|
puts row[:name]
end
数据集操作
创建数据集
dataset = DB[:items] # 等同于 DB.from(:items)
链式调用
Sequel 的许多方法支持链式调用,构建复杂的查询:
dataset = DB[:managers]
.where(salary: 5000..10000)
.order(:name, :department)
CRUD 操作
插入数据
dataset.insert(name: 'Sharon', grade: 50)
查询数据
# 遍历结果
dataset.each { |r| puts r }
# 获取所有记录
all_records = dataset.all # 返回数组
# 获取第一条记录
first_record = dataset.first
# 获取最后一条记录
last_record = dataset.last
更新和删除
# 删除非活跃记录
dataset.exclude(:active).delete
# 更新价格低于100的记录为活跃
dataset.where { price < 100 }.update(active: true)
# 更新活跃记录价格打9折
dataset.where(:active).update(price: Sequel[:price] * 0.90)
高级查询技巧
条件过滤
Sequel 提供了丰富的过滤条件:
# 相等条件
dataset.where(name: 'abc')
# 不等条件
dataset.where { value > 100 }
dataset.exclude { value <= 100 }
# 范围条件
dataset.where(value: 50..100)
dataset.where { (value >= 50) & (value <= 100) }
# IN 条件
dataset.where(value: [50,75,100])
dataset.where(id: other_dataset.select(:other_id))
# LIKE 和正则表达式
DB[:items].where(Sequel.like(:name, 'AL%'))
DB[:items].where(name: /^AL/)
逻辑运算符
# AND 条件
DB[:items].where { (x > 5) & (y > 10) }
# 组合条件
DB[:items].where(Sequel.or(x: 1, y: 2) & Sequel.~(z: 3))
数学运算
DB[:items].where { x + y > z }
DB[:items].where { price - 100 < avg(price) }
原生 SQL 片段
dataset.where(Sequel.lit('id = 1'))
dataset.where(Sequel.lit('name = ?', 'abc'))
dataset.where(Sequel.lit('value IN ?', [50,75,100]))
排序与分页
排序
dataset.order(:kind) # 升序
dataset.reverse(:kind) # 降序
dataset.order(Sequel.desc(:kind), :name) # 多列排序
分页
dataset.limit(30) # 限制30条
dataset.limit(30, 10) # 限制30条,偏移10条
dataset.limit(30).offset(10) # 同上
表连接
# 左外连接
DB[:items].left_outer_join(:categories, id: :category_id)
# 多表连接
DB[:items].join(:categories, id: :category_id)
.join(:groups, id: Sequel[:items][:group_id])
聚合函数
dataset.count # 记录数
dataset.max(:price) # 最大值
dataset.min(:price) # 最小值
dataset.avg(:price) # 平均值
dataset.sum(:stock) # 求和
# 分组统计
dataset.group_and_count(:category).all
dataset.select_group(:category).select_append { avg(:price) }
数据库模式操作
创建表
DB.create_table :items do
primary_key :id
String :name, unique: true, null: false
TrueClass :active, default: true
foreign_key :category_id, :categories
DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP, index: true
index [:category_id, :active]
end
删除表
DB.drop_table :items
事务处理
基本事务
DB.transaction do
dataset.insert(first_name: 'Inigo', last_name: 'Montoya')
dataset.insert(first_name: 'Farm', last_name: 'Boy')
end
嵌套事务
Sequel 支持嵌套事务,内部事务失败会自动回滚:
DB.transaction do
dataset.insert(first_name: 'Farm', last_name: 'Boy') # 会提交
DB.transaction(savepoint: true) do
dataset.insert(first_name: 'Inigo', last_name: 'Montoya') # 会回滚
raise(Sequel::Rollback)
end
dataset.insert(first_name: 'Prince', last_name: 'Humperdink') # 会提交
end
结语
本文涵盖了 Sequel ORM 的核心功能,从基础连接到高级查询都有涉及。Sequel 的设计哲学是提供灵活而强大的数据库操作接口,同时保持代码的简洁性。掌握这些基本操作后,您可以更高效地进行 Ruby 数据库开发。
sequel Sequel: The Database Toolkit for Ruby 项目地址: https://gitcode.com/gh_mirrors/seq/sequel
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考