Web Design

Sử dụng SQLite trong Electron

Với các bạn làm Android thì việc sử dụng SQLite rất phổ biến. Và bạn có biết là mình cũng có thể tương tác với SQLite với Electron khi build ứng dụng cho Windows, macOS và Linux theo hướng tương tự? Bài hướng dẫn này sẽ hướng dẫn các bạn tích hợp module sqlite3 vào Electron project của mình cùng một số methods cơ bản nhất.

sqlite-android-0

1. Tích hợp module:

Trước tiên, bạn cần cd vào thư mục Electron project của mình, và install module sqlite3 với câu lệnh không có gì lạ lùng:

Lưu ý: Bạn không nên install globally (-g) hay save-dev (–save-dev) vì bạn cần đóng gói module trên vào trong ứng dụng của bạn và package sqlite3 cần nằm trong thư mục node_modules của project. Lí do là chúng ta không sử dụng trực tiếp nó, mà bạn cần build nó riêng cho Electron trước mới có thể dùng được. Thay vì install trực tiếp và build từ src, bạn chỉ cần install nó như bình thường, và phần build thì làm theo hướng dẫn của tôi sẽ dễ dàng hơn. Nhưng trước hết, bạn cần có module electron-rebuild. Module này rất hữu hiệu vì nó giúp bạn build các native modules, không chỉ sqlite3 mà còn các gói khác nữa. Và bạn chỉ cần install nó với trong cmd, cmder hay Terminal:

Nếu muốn bạn vẫn có thể install globally cũng được vì bạn không cần phải đóng gói nó vào ứng dụng. Và trước khi chạy command này, bạn nên install các native modules khác nếu cần để nó tiến hành build cho bạn một lần luôn cho gọn:

Lưu ý là để gõ trực tiếp electron-rebuild thì bạn cần add thư mục node_modules/.bin/ (global hay của mỗi project của bạn hoặc nơi nào khác mà bạn cài electron-rebuild) vào PATH. Nếu chưa thì bạn cần gõ đầy đủ path trỏ tới nó trước dấu chấm, chẳng hạn như với Linux hay macOS:

Còn với Windows thì câu lệnh sẽ có khác biệt, vì Windows thích khác biệt:

Và nó sẽ tiến hành build (các) native modules, bao gồm sqlite3. Xin bạn vui lòng chờ trong giây lát. Trong quá trình chờ đợi, bạn có thể đọc chi tiết về module sqlite3 tại npmjselectron-rebuild cũng trên trang npmjs để có thêm thông tin về chúng.

2. Sử dụng sqlite3:

Sau khi electron-rebuild chạy xong thì bạn đã có thể thoải mái làm việc với module sqlite3. Đầu tiên, bạn cần require hay import nó như các modules khác. Ở đây, tôi tạo instance sau khi require luôn để đỡ tốn công đặt thêm nhiều biến:

Để tạo db mới, hoặc đọc một db từ một vị trí trên bộ nhớ máy tính, thì bạn gọi câu lệnh sau:

Trong đó, path là đường dẫn đầy đủ tới tập tin SQLite mà bạn muốn. Nếu tập tin chưa tồn tại thì nó sẽ khởi tạo tập tin khi bắt đầu thực hiện đọc ghi. Nếu bạn chỉ muốn tạo một db tạm thời nằm trên RAM và sẽ mất khi đóng ứng dụng, bạn sẽ truyền “:memory” vào path. Ngoài ra, bạn còn có thể đặt các tham số về mode, là chế độ đọc ghi tương tự như trong SQLite3 hay Android SQLiteDatabase, bao gồm sqlite3.OPEN_READONLY, sqlite3.OPEN_READWRITE và sqlite3.OPEN_CREATE, mặc định không truyền gì là OPEN_READWRITE | OPEN_CREATE. Bên cạnh đó, tham số callback sẽ được gọi để báo kết quả là có mở được db không, nó chứa đúng một param error sẽ không null nếu có lỗi. Chẳng hạn:

Để tiến hành các thao tác với dữ liệu, trước hết bạn cần serialize db trước với câu lệnh:

Trong đó, whatNext chứa các methods mà bạn sẽ cho thực hiện ngay sau khi serialize xong. Nó là một function không chứa tham số nào. Chẳng hạn:

Câu lệnh db.run(sql, [param, …], [callback]) chính là phần lệnh thao tác với chính tập tin CSDL của bạn. Trong đó, sql dĩ nhiên là câu lệnh SQL của bạn, còn [params…] là các tham số sẽ được truyền vào dấu “?” nếu có và callback sẽ gọi kết quả của quá trình thực hiện. Nếu bạn muốn gọi callback mà không sử dụng [params…], bạn cứ truyền mảng trống là được. Chẳng hạn:

Để lấy dữ liệu của một dòng, hoặc chạy một câu lệnh sql mà bạn mong muốn trả ra kết quả, bạn chạy db.get, với syntax như trên, chỉ khác ở chỗ phần callback sẽ có thêm một param sau error nữa là kết quả mà quá trình thực thi sẽ trả về. Chẳng hạn:

Để lấy kết quả của toàn bộ các dòng, bạn có thể chạy từng dòng một nếu muốn, với db.each:

Hoặc bạn cũng có thể lấy tất cả các dòng cùng một lúc với db.all:

Lưu ý: Phần kết quả trả về được sắp xếp theo tên cột, chẳng hạn, row.first_name để lấy phần tử ở cột first_name. Nếu bạn chưa biết kết quả trả về gồm các props gì, thì bạn nên log cả kết quả ra để tìm prop bạn mong muốn.

Ngoài ra, bạn cũng có thể cho thực hiện các câu lệnh SQL bằng cách “chuẩn bị” (prepare) chúng trước rồi cho chạy một lượt, chẳng hạn:

Và nếu bấy nhiêu methods vừa đủ vẫn chưa đủ cho bạn thao tác, hãy tham khảo phần APIs của sqlite3 tại https://github.com/mapbox/node-sqlite3/wiki/API.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.