Khóa học ruby

Database Access trong Ruby

0 phút đọc

Truy cập cơ sở dữ liệu là một phần quan trọng trong lập trình ứng dụng, cho phép bạn lưu trữ, truy vấn và quản lý dữ liệu một cách hiệu quả. Ruby cung cấp nhiều thư viện và công cụ để làm việc với cơ sở dữ liệu, trong đó có DBI (Database Interface) là một trong những thư viện phổ biến nhất. Bài viết này sẽ đi sâu vào cách sử dụng DBI trong Ruby để truy cập và thao tác với cơ sở dữ liệu, bao gồm các chủ đề như kiến trúc của ứng dụng DBI, cài đặt, kết nối cơ sở dữ liệu, các thao tác CRUD (Create, Read, Update, Delete), thực hiện giao dịch, và xử lý lỗi.

Kiến trúc của ứng dụng DBI (Architecture of a DBI Application)

DBI (Database Interface) là một lớp trừu tượng cho phép bạn làm việc với nhiều loại cơ sở dữ liệu khác nhau mà không cần phải thay đổi mã nguồn của bạn. DBI cung cấp một giao diện nhất quán cho các thao tác cơ sở dữ liệu, bao gồm kết nối, truy vấn, và quản lý giao dịch.

Yêu cầu (Prerequisites)

Trước khi bắt đầu, bạn cần cài đặt Ruby và một cơ sở dữ liệu như MySQL, PostgreSQL, hoặc SQLite. Bạn cũng cần cài đặt các thư viện DBI và các driver tương ứng cho cơ sở dữ liệu của bạn.

Cài đặt Ruby/DBI (Obtaining and Installing Ruby/DBI)

Bạn có thể cài đặt DBI và các driver cơ sở dữ liệu bằng cách sử dụng RubyGems. Dưới đây là cách cài đặt DBI và driver cho SQLite:

gem install dbi
gem install dbd-sqlite3

Kết nối cơ sở dữ liệu (Database Connection)

Để kết nối với cơ sở dữ liệu, bạn sử dụng phương thức DBI.connect và cung cấp chuỗi kết nối, tên người dùng và mật khẩu.

require 'dbi'

begin
  dbh = DBI.connect('DBI:SQLite3:example.db')
  puts "Kết nối thành công!"
rescue DBI::DatabaseError => e
  puts "Lỗi: #{e.message}"
ensure
  dbh.disconnect if dbh
end

Thao tác INSERT (INSERT Operation)

Bạn có thể sử dụng phương thức do để thực hiện các thao tác INSERT, UPDATE, DELETE.

require 'dbi'

begin
  dbh = DBI.connect('DBI:SQLite3:example.db')
  dbh.do("INSERT INTO users (name, age) VALUES ('Alice', 30)")
  puts "Thêm dữ liệu thành công!"
rescue DBI::DatabaseError => e
  puts "Lỗi: #{e.message}"
ensure
  dbh.disconnect if dbh
end

Sử dụng câu lệnh do (Using do Statement)

Phương thức do thực hiện một câu lệnh SQL và trả về số hàng bị ảnh hưởng.

rows_affected = dbh.do("UPDATE users SET age = 31 WHERE name = 'Alice'")
puts "Số hàng bị ảnh hưởng: #{rows_affected}"

Sử dụng prepareexecute (Using prepare and execute)

Phương thức prepare tạo một đối tượng câu lệnh chuẩn bị, và execute thực hiện câu lệnh đó.

require 'dbi'

begin
  dbh = DBI.connect('DBI:SQLite3:example.db')
  sth = dbh.prepare("INSERT INTO users (name, age) VALUES (?, ?)")
  sth.execute('Bob', 25)
  sth.finish
  puts "Thêm dữ liệu thành công!"
rescue DBI::DatabaseError => e
  puts "Lỗi: #{e.message}"
ensure
  dbh.disconnect if dbh
end

Thao tác READ (READ Operation)

Bạn có thể sử dụng phương thức select_all để truy vấn dữ liệu từ cơ sở dữ liệu.

require 'dbi'

begin
  dbh = DBI.connect('DBI:SQLite3:example.db')
  sth = dbh.execute("SELECT * FROM users")
  sth.fetch do |row|
    puts "Name: #{row['name']}, Age: #{row['age']}"
  end
  sth.finish
rescue DBI::DatabaseError => e
  puts "Lỗi: #{e.message}"
ensure
  dbh.disconnect if dbh
end

Thao tác UPDATE (Update Operation)

Bạn có thể sử dụng phương thức do hoặc prepareexecute để thực hiện các thao tác UPDATE.

require 'dbi'

begin
  dbh = DBI.connect('DBI:SQLite3:example.db')
  dbh.do("UPDATE users SET age = 32 WHERE name = 'Alice'")
  puts "Cập nhật dữ liệu thành công!"
rescue DBI::DatabaseError => e
  puts "Lỗi: #{e.message}"
ensure
  dbh.disconnect if dbh
end

Thao tác DELETE (DELETE Operation)

Bạn có thể sử dụng phương thức do hoặc prepareexecute để thực hiện các thao tác DELETE.

require 'dbi'

begin
  dbh = DBI.connect('DBI:SQLite3:example.db')
  dbh.do("DELETE FROM users WHERE name = 'Bob'")
  puts "Xóa dữ liệu thành công!"
rescue DBI::DatabaseError => e
  puts "Lỗi: #{e.message}"
ensure
  dbh.disconnect if dbh
end

Thực hiện giao dịch (Performing Transactions)

DBI hỗ trợ các giao dịch, cho phép bạn thực hiện nhiều thao tác cơ sở dữ liệu như một đơn vị nguyên tử. Bạn có thể sử dụng các phương thức commitrollback để quản lý giao dịch.

require 'dbi'

begin
  dbh = DBI.connect('DBI:SQLite3:example.db')
  dbh.transaction do
    dbh.do("INSERT INTO users (name, age) VALUES ('Charlie', 28)")
    dbh.do("UPDATE users SET age = 29 WHERE name = 'Charlie'")
  end
  puts "Giao dịch thành công!"
rescue DBI::DatabaseError => e
  puts "Lỗi: #{e.message}"
  dbh.rollback
ensure
  dbh.disconnect if dbh
end

Thao tác COMMIT (COMMIT Operation)

Phương thức commit xác nhận các thay đổi trong giao dịch.

dbh.commit

Thao tác ROLLBACK (ROLLBACK Operation)

Phương thức rollback hủy bỏ các thay đổi trong giao dịch.

dbh.rollback

Ngắt kết nối cơ sở dữ liệu (Disconnecting Database)

Phương thức disconnect ngắt kết nối cơ sở dữ liệu.

dbh.disconnect if dbh

Xử lý lỗi (Handling Errors)

DBI cung cấp lớp DBI::DatabaseError để xử lý các lỗi cơ sở dữ liệu.

begin
  dbh = DBI.connect('DBI:SQLite3:example.db')
  dbh.do("INVALID SQL STATEMENT")
rescue DBI::DatabaseError => e
  puts "Lỗi: #{e.message}"
ensure
  dbh.disconnect if dbh
end

Khối mã với phương thức (Code Blocks with Methods)

Bạn có thể sử dụng khối mã với các phương thức DBI để đảm bảo rằng tài nguyên được giải phóng đúng cách.

DBI.connect('DBI:SQLite3:example.db') do |dbh|
  dbh.do("INSERT INTO users (name, age) VALUES ('Dave', 35')")
end

Các hàm và thuộc tính đặc thù của driver (Driver-specific Functions and Attributes)

Một số driver cơ sở dữ liệu cung cấp các hàm và thuộc tính đặc thù mà bạn có thể sử dụng để tận dụng các tính năng cụ thể của cơ sở dữ liệu.

require 'dbi'

begin
  dbh = DBI.connect('DBI:SQLite3:example.db')
  puts "SQLite version: #{dbh.func(:sqlite_version)}"
rescue DBI::DatabaseError => e
  puts "Lỗi: #{e.message}"
ensure
  dbh.disconnect if dbh
end

Kết luận

Truy cập cơ sở dữ liệu trong Ruby thông qua DBI là một cách mạnh mẽ và linh hoạt để quản lý dữ liệu. Bằng cách sử dụng các phương thức và kỹ thuật được mô tả trong bài viết này, bạn có thể thực hiện các thao tác cơ sở dữ liệu một cách hiệu quả và an toàn. Hãy tiếp tục khám phá và thực hành với DBI trong Ruby để trở thành một lập trình viên giỏi hơn.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Is GraphQL a Database Technology?

entry

Ruby on Rails là gì?

entry

Is there an equivalent of “continue” in Ruby?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào