2020.06.09

Giới thiệu về SQLite3 và Hướng dẫn cài đặt SQLite3 trên Docker

Chào các bạn, mình rất vui khi được chia sẻ với các bạn kiến thức về các công nghệ đang được sử dụng tại MarketEnterprise Vietnam.

1.Lời mở đầu

Hôm nay mình muốn giới thiệu về SQLite. SQLite là một thư viện phần mềm được sử dụng trong việc quản lý cơ sở dữ liệu (Database) quan hệ nhỏ gọn, không cần máy chủ, dễ sử dụng, nhanh, tiện dụng được sử dụng rộng rãi trên thế giới như:

  • Adobe: Dùng SQLite cho phần mềm Adobe Lightroom.
  • Google: Dùng SQLite cho hệ điều hành Android và trình duyệt Chrome.
  • Facebook: Dùng SQLite như một hệ quản trị Cơ sở dữ liệu trên Osquery
  • Apple: Dùng SQLite cho rất nhiều ứng dụng desktop chạy trên nền tảng MAC OSX, Apple cũng sử dụng SQlite cho iTunes, Safari,…
  • Airbus: Dùng SQLite cho phần mềm quản lý bay của gia đình dòng máy bay A350 XWB.
  • Bosch: Dùng SQLite cho các hệ thống đa phương tiện được cài đặt trên các dòng xe của các hãng General Motors, Nissan và Suzuki.

Ngoài ra còn rất nhiều các Công ty lớn khác đang sử dụng SQLite các bạn có thể tham khảo thêm tại đây.

2.SQLite là gì?

SQLite là phần mềm quản lý cơ sở dữ liệu (Database Management System) tương tự như Mysql, PostgreSQL… Đặc điểm của SQLite là không cần máy chủ, không cần cấu hình, nhanh, nhỏ gọn, khép kín, có độ tin cậy cao và hỗ trợ hầu như đầy đủ các tính năng cần thiết trong chuẩn SQL92. 

Dữ liệu Database cũng được lưu trên một file duy nhất. Không có khái niệm user, password hay quyền hạn trong SQLite Database. SQLite không thích hợp với những hệ thống lớn nhưng ở quy mô vừa tầm thì SQLite phát huy uy lực và không hề yếu kém về mặt chức năng hay tốc độ.

3.Đặt vấn đề

Trong trường hợp bạn cần xây dựng một ứng dụng ghi chú nhỏ, không sử dụng mô hình máy chủ/khách cho việc thử nghiệm hoặc sử dụng, việc lưu dữ liệu chỉ sử dụng cho một người dùng. Tốc độ phình to của dữ liệu thấp và tổ chức dữ liệu của giữa các bảng trong Cơ sở dữ liệu của ứng dụng không quá phức tạp. 

4.Hướng giải quyết

Trong trường hợp này mình quyết định chọn SQLite vì ưu điểm dễ cài đặt, nhanh, nhỏ gọn, tất cả dữ liệu chỉ lưu trữ trong 1 tập tin duy nhất để xây dựng một ứng dụng Todo List nhỏ như ảnh bên dưới.



5.Hướng dẫn cài đặt SQLite3, Ruby On Rails với Docker

Trong ví dụ này MEVN sẽ xây dựng một ứng dụng Todo List nhỏ sử dụng Docker, Ruby On Rails 6SQLite3. Các bạn có thể sử dụng các công nghệ khác tùy theo mục tiêu của mỗi dự án.

Sau đây, mình sẽ hướng dẫn các bạn cách cài đặt và sử dụng SQLite3 với Ruby On Rails trên Docker. Để tránh gây loãng bài viết về SQLite3 mình có thêm phần tài liệu tham khảo ở cuối bài viết các bạn có thể tham khảo thêm. 

Sau khi cài đặt Docker các bạn vào dự án tạo 2 file mới đặt tên là Dockerfile (Lưu ý tập tin không có phần mở rộng) và file docker-compose.yml . Dưới đây là cấp thư mục hiện tại của dự án.



Các bạn mở file Dockerfile và thêm các dòng như bên dưới:

Dockerfile



Dòng RUN apt-get install -y sqlite3 dùng để cài đặt SQLite3 chạy trên môi trường ruby.

Sau khi thêm dòng cài đặt Sqlite3 vào Dockerfile tiếp theo chúng ta sẽ thiết lập container cho ruby trên file docker-compose.yml ( Các bạn có thể tham khảo thêm cách xây dựng file docker-compose trong link tham khảo bên dưới ).

Sau khi tạo và lưu file docker-compose.yml, việc tiếp theo chúng ta cần làm tạo di chuyển đến thư mục rubyapp/source và tạo một project mới sử dụng lệnh rails <tên project>. (Chú ý tuỳ theo hệ điều hành mà bạn đang sử dụng các bạn sẽ cần cài đặt Ruby, RubyGemsRails vào máy trước khi thực hiện bước tiếp theo này, các bạn tham khảo tài liệu hướng dẫn bên dưới).

Mình đặt tên dự án là Todos. Chúng ta chạy lệnh rails new Todos mặc định Ruby On Rails sẽ tạo project có thiết lập sẵn cho SQLite

Sau khi chạy xong lệnh chúng ta sẽ có một thư mục project Todo 

 

Các bạn tiếp tục gõ lệnh để docker build image và chạy docker-compose up để tải các image bổ sung cho việc tạo container

“docker-compose build

docker-compose up”

Sau khi chạy xong các bạn sẽ nhận được thông báo hoàn tất việc chạy container cho ruby.Tiếp theo chúng ta truy cập vào đường dẫn localhost:3000 và nếu như bạn setup thành công bạn sẽ nhận được thông báo như ảnh bên dưới.

Yayyyyyyyy!!!!!!! Chúng ta đã cài đặt và tích hợp thành công SQLite3 trên Ruby On Rails

Bây giờ chúng ta sẽ bắt đầu xây dựng ứng dụng Todos nhỏ để tương tác với Database của SQLite

Các bạn chạy lệnh exec để truy cập vào container của ruby và thực thi lệnh khởi tạo controller todo với action ‘index’ : 

“docker exec -it rails_ruby rails generate controller todos index”

Sau khi chạy xong lệnh trên các bạn sẽ có 1 file controller/todos_controller và 1 file views/todos/index.html.erb trong thư mục app của dự án, rails cũng tạo sẵn cho bạn 1 route trong file config/routes.rb

Các bạn tiếp tục mở file routes.rb và thêm dòng route resource như bên dưới

Sau khi thêm route các bạn có thể truy cập vào đường dẫn localhost:3000 ứng dụng của bạn sẽ hiển thị như thế này:

Mặc định Ruby On Rails sẽ hỗ trợ SQLite 3 nhưng để config database cho SQLite3 hoặc các database khác bạn có thể vào config/database.yml

Bây giờ chúng ta sẽ bắt đầu tạo model trong Rails để tạo table Todo trong SQLite



Các bạn chạy lệnh sau để tạo model cho project

“docker exec -it rails_ruby rails generate model todo”Rails sẽ sinh ra file model/todo.rb  và file db/migrate/20200604071501_create_todos.rb  như ảnh bên dưới

Chúng ta tiếp tục mở file db/migrate/20200604071501_create_todos.rb và thêm các dòng như bên dưới để tạo và định dạng kiểu dữ liệu cho các cột trong table của SQLite3



Bạn tiếp tục chạy lệnh command bên dưới để migrate và khởi tạo database

“docker exec -it rails_ruby rails db:migrate”

Sau khi thực thi xong lệnh migrate, Rails sẽ sinh cho bạn một file db/development.sqlite3 tất cả dữ liệu của các bạn sẽ được SQLite lưu trong một file duy nhất.Dùng ứng dụng DB Browser for SQLite để mở file development.sqlite3 bạn sẽ thấy cấu trúc của table todos của chúng ta sau khi khởi tạo như sau:

Chúng ta cũng thử đổ 10 dòng dữ liệu bằng lệnh rails db:seed được hỗ trợ bởi Rail để đổ một số dữ liệu và database, để làm việc này các bạn vào file db/seeds.rb và thêm dòng bên dưới

Chúng ta tiếp tục chạy lệnh để đổ dữ liệu thử nghiệm vào database:

docker exec -it rails_ruby rails db:seed

Kiểm tra dữ liệu sau khi đổ bằng DB Browser for SQLite

  1. Sau khi xây dựng giao diện ứng dụng bằng html, css chúng ta vào file views/todos/index.html.erb và thêm các dòng code để hiển thị và xử lý dữ liệu từ database ra màn hình.

Chúng ta vào controllers/todos_controller.rb và thêm hàm index lấy dữ liệu từ database thông qua model.



Hiện tại Todo List sẽ hiển thị dữ liệu như bên dưới, do chúng ta đã chạy lệnh rails db:seed để thêm dữ liệu vào database trước đó.



Chúng ta tiếp tục mở file controllers/todo_controller.rb và thêm code insert dữ liệu vào database. Chúng ta truyền dữ liệu bằng params với biến description kiểu dữ liệu là string.



Thử thêm mới một task có tên là “Thử nghiệm” vào database của SQLite ta sẽ nhận được kết quả sau:



Kiểm tra lại dữ liệu trong file db/development.sqlite3 bằng công cụ DB Browser For SQLite cơ sở dữ liệu đã có thêm một dòng mới với tên là “Thử nghiệm”.



2.Để xoá một dòng trong cơ sở dữ liệu chúng ta tiếp tục mở file controller/todos_controller.rb và thêm hàm destroy dựa trên id của dòng được chọn.

Chúng ta thử xoá task “Thử nghiệm” vừa thêm vào và đây là kết quả



Sau khi xoá task thử nghiệm chúng ta dùng DB Browser for SQLite để kiểm tra lại dữ liệu đang có bên trong file development.sqlite3

Task “Thử nghiệm” đã được xoá khỏi cơ sở dữ liệu.



3.Sau đó chúng ta thêm hàm update lại dữ liệu đã chọn để update lại trạng thái của task sau khi đã update hoàn tất vào cơ sở dữ liệu.



Hiện tại checkbox của chúng ta đang được check cả 3 dòng



Chúng ta thử thay đổi trạng thái của checkbox task “Test” đầu tiên thử xem nhé.



Kiểm tra lại dữ liệu của cột status trong file development.sqlite3 tại dòng đầu tiên, trạng thái đã được thay đổi về “uncheck”



6.Ưu điểm của SQLite

– Vì SQLite không cần client–server database engine nên có thể hiểu file CSDL đã tích hợp mọi thứ, sử dụng ngay không cần phải cài đặt thêm thứ gì.

– SQLite không cần cấu hình, nghĩa là không cần thiết phải cài đặt.

–  Với SQLite, Database đầy đủ được lưu giữ trong một tập tin duy nhất.

– SQLite là rất nhỏ gọn, nhỏ hơn 600kB đã được cấu hình đầy đủ hoặc nhỏ hơn 250kB khi đã bỏ qua các tính năng tùy ý.

7.Hạn chế của SQLite

–  Do sử dụng cơ chế coarse-gained locking nên trong cùng một thời điểm SQLite có thể hỗ trợ nhiều người đọc dữ liệu, nhưng chỉ có 1 người có thể ghi dữ liệu.

– SQLite không phải là lựa chọn hoàn hảo để đáp ứng các nhu cầu xử lý trên một khối lượng dữ liệu lớn, phát sinh liên tục.

–  SQLite cũng thiếu các tính năng đo lường hiệu suất

8.Tổng kết

Vậy là mình đã chia sẻ xong với mọi người về SQLite. Chúng ta đang sống trong một thời đại công nghệ phát triển nhanh, những công nghệ đang phổ biến hoặc đang được sử dụng tại MarketEnterprise Vietnam đều là những công nghệ mới góp phần nâng cao chất lượng cuộc sống cho mọi người. 

Thông qua những kiến thức trong bài viết về SQLite, hy vọng các bạn có thể hiểu thêm về SQLite, về những thế mạnh, ưu điểm, nhược điểm và những công dụng của SQLite trong cuộc sống hàng ngày và trong công việc của các bạn.

9.Tham khảo thêm