📜  在 ruby 中更新数据库(1)

📅  最后修改于: 2023-12-03 15:23:18.625000             🧑  作者: Mango

在 Ruby 中更新数据库

在 Ruby 中,可以使用多种方法更新数据库。常见的方法包括使用 ActiveRecord、Sequel 和 DataMapper 等 ORM(对象关系映射)框架,以及使用原生的 SQL 语句。

ActiveRecord

ActiveRecord 是 Ruby on Rails 中内置的 ORM 框架。通过继承 ActiveRecord::Base 类,可以定义数据模型,并使用内置的方法进行数据库操作。

连接数据库

在 Rails 项目中,ActiveRecord 默认使用 config/database.yml 文件中的配置连接数据库。可以修改该文件中的配置,或在代码中手动指定连接参数,如下所示:

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter: 'postgresql',
  host: 'localhost',
  username: 'myuser',
  password: 'mypassword',
  database: 'mydatabase'
)
定义模型

在定义模型类时,需要指定模型对应的表名和列名,以及各列的数据类型、长度、是否允许为空等信息。常见的数据类型包括 stringtextintegerfloatdecimaldatetimetimestampboolean 等。

class User < ActiveRecord::Base
  # 指定表名
  self.table_name = 'users'

  # 指定列名和数据类型
  attribute :name, :string
  attribute :email, :string
  attribute :age, :integer
  attribute :created_at, :datetime
  attribute :updated_at, :datetime

  # 其他方法...
end
创建记录

使用 createnewsave 等方法可以创建新的记录并保存到数据库中。

# 创建新记录
user = User.create(name: 'Alice', email: 'alice@example.com', age: 25)

# 批量创建新记录
users = User.create([
  {name: 'Bob', email: 'bob@example.com', age: 30},
  {name: 'Charlie', email: 'charlie@example.com', age: 35}
])

# 创建新记录(不保存到数据库)
user = User.new(name: 'David', email: 'david@example.com')
user.age = 40
user.save
更新记录

使用 updateupdate_allupdate_attribute 等方法可以更新已有的记录。

user = User.find_by(name: 'Alice')

# 单个属性更新
user.update(email: 'new-email@example.com')

# 多个属性更新
user.update(email: 'new-email@example.com', age: 26)

# 批量更新
User.where(age: 30).update_all(age: 31)

# 更新单个属性(不触发回调)
user.update_attribute(:email, 'new-email@example.com')
删除记录

使用 destroydestroy_alldelete 等方法可以删除已有的记录。

user = User.find_by(name: 'Alice')

# 删除单个记录
user.destroy

# 删除多个记录
User.where(age: 30).destroy_all

# 删除单个记录(不触发回调)
user.delete
数据验证

在创建和更新记录时,可以使用数据验证方法检查记录是否符合要求。常用的验证方法包括 presenceuniquenesslength 等。

class User < ActiveRecord::Base
  # ...

  # 数据验证
  validates :name, presence: true, length: {minimum: 2}
  validates :email, presence: true, uniqueness: true
  validates :age, numericality: {greater_than_or_equal_to: 18}
end
Sequel

Sequel 是另一个流行的 Ruby ORM 框架。与 ActiveRecord 不同,Sequel 支持多种数据库(如 MySQL、PostgreSQL、SQLite、Oracle、Microsoft SQL Server 等)。

连接数据库

可以使用 Sequel.connect 方法连接数据库,并传入连接参数。

require 'sequel'

DB = Sequel.connect(
  adapter: 'postgresql',
  host: 'localhost',
  user: 'myuser',
  password: 'mypassword',
  database: 'mydatabase'
)
定义模型

Sequel 支持两种方式定义模型类:类模板和表模板。类模板定义模型的属性和行为,表模板定义模型与数据库表的关系。

# 类模板
class User < Sequel::Model
  # 属性定义
  plugin :validation_helpers
  def validate
    super
    validates_presence [:name, :email]
    validates_unique :email
    validates_min_length 2, :name
    validates_integer :age
    validates_range 18.., :age
  end

  # 行为定义
  def to_s
    "#{name} (#{email}), #{age} years old"
  end
end

# 表模板(例)
DB.create_table? :users do
  primary_key :id
  String :name
  String :email
  Integer :age
  DateTime :created_at
  DateTime :updated_at
end
创建记录

使用 createnewsave 等方法可以创建新的记录并保存到数据库中。

# 创建新记录
user = User.create(name: 'Alice', email: 'alice@example.com', age: 25)

# 批量创建新记录
users = User.create([
  {name: 'Bob', email: 'bob@example.com', age: 30},
  {name: 'Charlie', email: 'charlie@example.com', age: 35}
])

# 创建新记录(不保存到数据库)
user = User.new(name: 'David', email: 'david@example.com')
user.age = 40
user.save
更新记录

使用 updateupdate_all 等方法可以更新已有的记录。

user = User[name: 'Alice']

# 单个属性更新
user.update(email: 'new-email@example.com')

# 多个属性更新
user.update(email: 'new-email@example.com', age: 26)

# 批量更新
User.where(age: 30).update(age: 31)
删除记录

使用 destroydestroy_all 等方法可以删除已有的记录。

user = User[name: 'Alice']

# 删除单个记录
user.destroy

# 删除多个记录
User.where(age: 30).destroy_all
数据验证

在创建和更新记录时,可以使用数据验证方法检查记录是否符合要求。常用的验证方法与 ActiveRecord 相同。

class User < Sequel::Model
  # ...

  # 数据验证
  plugin :validation_helpers
  def validate
    super
    validates_presence [:name, :email]
    validates_unique :email
    validates_min_length 2, :name
    validates_integer :age
    validates_range 18.., :age
  end
end
DataMapper

DataMapper 是另一个 Ruby ORM 框架,可以使用其它第三方数据存储。

连接数据库

可以使用 DataMapper.setup 方法连接数据库,并传入连接参数。

require 'data_mapper'

DataMapper.setup(:default, 'sqlite::memory:')

# 或者
DataMapper.setup(:default, {
  adapter: 'mysql',
  host: 'localhost',
  username: 'myuser',
  password: 'mypassword',
  database: 'mydatabase'
})
定义模型

可以使用 DataMapper::Resource 类定义模型类,并在模型类中定义属性和方法。模型类对应的表和列名将根据模型类名和属性名自动生成。

class User
  include DataMapper::Resource

  # 定义属性
  property :id, Serial
  property :name, String
  property :email, String
  property :age, Integer
  property :created_at, DateTime
  property :updated_at, DateTime

  # 其他方法...
end

# 自动迁移表
DataMapper.finalize.auto_upgrade!
创建记录

使用 createnewsave 等方法可以创建新的记录并保存到数据库中。

# 创建新记录
user = User.create(name: 'Alice', email: 'alice@example.com', age: 25)

# 批量创建新记录
users = User.create([
  {name: 'Bob', email: 'bob@example.com', age: 30},
  {name: 'Charlie', email: 'charlie@example.com', age: 35}
])

# 创建新记录(不保存到数据库)
user = User.new(name: 'David', email: 'david@example.com')
user.age = 40
user.save
更新记录

使用 save 等方法可以更新已有的记录。

user = User.first(name: 'Alice')

# 单个属性更新
user.email = 'new-email@example.com'
user.save

# 多个属性更新
user.update(email: 'new-email@example.com', age: 26)
user.save
删除记录

使用 destroydestroy_all 等方法可以删除已有的记录。

user = User.first(name: 'Alice')

# 删除记录
user.destroy
数据验证

在创建和更新记录时,可以使用数据验证方法检查记录是否符合要求。

class User
  include DataMapper::Resource

  # 数据验证
  validates_presence_of :name, :email
  validates_uniqueness_of :email
  validates_length_of :name, :minimum => 2
  validates_numericality_of :age
  validates_with_method :age, :method => :check_age

  def check_age
    age >= 18
  end

  # 其他方法...
end