📅  最后修改于: 2023-12-03 15:23:18.625000             🧑  作者: Mango
在 Ruby 中,可以使用多种方法更新数据库。常见的方法包括使用 ActiveRecord、Sequel 和 DataMapper 等 ORM(对象关系映射)框架,以及使用原生的 SQL 语句。
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'
)
在定义模型类时,需要指定模型对应的表名和列名,以及各列的数据类型、长度、是否允许为空等信息。常见的数据类型包括 string
、text
、integer
、float
、decimal
、datetime
、timestamp
、boolean
等。
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
使用 create
、new
和 save
等方法可以创建新的记录并保存到数据库中。
# 创建新记录
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
使用 update
、update_all
和 update_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')
使用 destroy
、destroy_all
和 delete
等方法可以删除已有的记录。
user = User.find_by(name: 'Alice')
# 删除单个记录
user.destroy
# 删除多个记录
User.where(age: 30).destroy_all
# 删除单个记录(不触发回调)
user.delete
在创建和更新记录时,可以使用数据验证方法检查记录是否符合要求。常用的验证方法包括 presence
、uniqueness
、length
等。
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 是另一个流行的 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
使用 create
、new
和 save
等方法可以创建新的记录并保存到数据库中。
# 创建新记录
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
使用 update
和 update_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)
使用 destroy
和 destroy_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 是另一个 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!
使用 create
、new
和 save
等方法可以创建新的记录并保存到数据库中。
# 创建新记录
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
使用 destroy
和 destroy_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