Sequel ORM 快速参考指南:数据库操作与查询技巧

Sequel ORM 快速参考指南:数据库操作与查询技巧

sequel Sequel: The Database Toolkit for Ruby sequel 项目地址: 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 sequel 项目地址: https://gitcode.com/gh_mirrors/seq/sequel

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沈菱嫱Marie

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

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

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

打赏作者

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

抵扣说明:

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

余额充值