Menu

Tạo database SQLite: cách tạo tệp .db mới

Cách tạo cơ sở dữ liệu SQLite: mô hình dựa trên tệp, lệnh sqlite3, và vì sao không có câu lệnh CREATE DATABASE.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Cơ sở dữ liệu SQLite chỉ là một tệp

Nếu đã dùng MySQL hay Postgres, bạn quen với việc chạy CREATE DATABASE myapp; và để máy chủ tự quản lý một cơ sở dữ liệu mới ở đâu đó khuất tầm mắt. SQLite không hoạt động như vậy. Không có máy chủ. Không có câu lệnh CREATE DATABASE. Một cơ sở dữ liệu là một tệp thông thường duy nhất trên ổ đĩa, thường có đuôi .db, .sqlite hoặc .sqlite3, nhưng đuôi tệp chỉ là quy ước.

Để tạo một cơ sở dữ liệu, bạn trỏ công cụ sqlite3 tới một tên tệp chưa tồn tại:

sqlite3 mydata.db

Vậy thôi. Nếu mydata.db chưa tồn tại, SQLite sẵn sàng tạo nó. Nếu đã có, SQLite mở nó ra. Cùng một lệnh cho cả hai trường hợp. Mô hình này gần với "mở một tài liệu" hơn là "dựng một máy chủ cơ sở dữ liệu."

Tệp chỉ xuất hiện khi bạn ghi gì đó

Đây là điều hay làm người mới bối rối. Chạy lệnh ở trên, gõ .quit, rồi nhìn vào thư mục. Tệp không có ở đó.

SQLite rất lười. Nó không buồn tạo tệp trên ổ đĩa cho tới khi có thứ gì đó để ghi vào. Ngay khi bạn tạo một bảng hoặc commit dữ liệu, tệp sẽ xuất hiện:

Giờ thì mydata.db đã nằm trên ổ đĩa. Trước lần ghi đầu tiên đó, "cơ sở dữ liệu" chỉ tồn tại trong bộ nhớ của kết nối. Điều này đôi khi gây bối rối, và đôi khi lại có ích, vì một phiên bị hủy giữa chừng sẽ không để lại dấu vết gì.

Tạo cơ sở dữ liệu từ CLI

Toàn bộ quy trình từ một shell mới:

$ sqlite3 mydata.db
SQLite version 3.45.0
Enter ".help" for usage hints.
sqlite> CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
sqlite> .databases
main: /home/you/mydata.db r/w
sqlite> .quit

Vài lệnh CLI hữu ích khi bạn đang ở trong đó:

  • .databases: liệt kê các cơ sở dữ liệu đang gắn và đường dẫn tệp của chúng.
  • .tables: liệt kê các bảng trong cơ sở dữ liệu hiện tại.
  • .schema: hiển thị câu lệnh CREATE TABLE của mọi thứ.
  • .quit: thoát.

Nếu bạn đã ở trong sqlite3 mà chưa mở tệp nào (bạn khởi động nó không kèm đối số), bạn có thể gắn một tệp bằng .open:

sqlite> .open mydata.db

Cùng quy tắc: tạo nếu chưa có, mở nếu đã có.

"If not exists" có sẵn

Một nỗi lo quen thuộc khi chuyển từ các cơ sở dữ liệu khác: nếu tệp đã có rồi thì sao? Liệu có bị ghi đè không? Không. Mở một tệp có sẵn thì chỉ là mở nó. Không có gì bị ghi đè. Thứ gần nhất với CREATE DATABASE IF NOT EXISTS chính là... mở tệp. SQLite xử lý cả hai trường hợp bằng cùng một lệnh.

Nếu bạn thật sự muốn bắt đầu lại từ đầu, hãy xóa tệp trước:

rm mydata.db
sqlite3 mydata.db

Nhưng hãy chắc đó là điều bạn muốn. Không có cách hoàn tác, cũng không có công cụ quản trị nào để khôi phục.

Tạo cơ sở dữ liệu bằng Python

Phần lớn thời gian bạn sẽ không ở trong CLI mà tạo cơ sở dữ liệu từ code ứng dụng. Python có sẵn module sqlite3 trong thư viện chuẩn, không cần cài đặt:

sqlite3.connect("mydata.db") theo đúng quy tắc của CLI: tạo tệp nếu chưa có, mở nếu đã có. Mọi binding của các ngôn ngữ khác (better-sqlite3 của Node, driver database/sql của Go, rusqlite của Rust, v.v.) cũng hoạt động như vậy, vì bên dưới chúng đều bọc cùng một thư viện C.

Một lối tắt riêng của Python: truyền ":memory:" làm đường dẫn sẽ cho bạn một cơ sở dữ liệu nằm hoàn toàn trong RAM và biến mất khi đóng kết nối. Đó là nội dung trang tiếp theo.

Nên đặt tệp ở đâu?

Vì cơ sở dữ liệu là một tệp, câu hỏi "đặt nó ở đâu?" là câu hỏi thật. Vài quy tắc kinh nghiệm:

  • Với một ứng dụng: đặt ở đâu đó trong thư mục dữ liệu của người dùng hoặc thư mục làm việc của ứng dụng. Đừng đặt cạnh tệp thực thi trên những hệ thống mà đường dẫn đó không ghi được.
  • Với một dự án: đặt ở thư mục gốc của repo hoặc trong thư mục data/. Thêm nó vào .gitignore nếu nó chứa trạng thái cục bộ: đưa một cơ sở dữ liệu nhị phân vào Git hiếm khi có kết cục tốt.
  • Với test: dùng :memory: hoặc một tệp tạm. Nhanh và tự dọn dẹp.

Quyền truy cập cũng quan trọng. Người dùng chạy tiến trình cần quyền đọc và ghi trên cả tệp lẫn thư mục cha của nó (SQLite tạo các tệp khóa cạnh cơ sở dữ liệu trong lúc ghi).

Kiểm tra nhanh

Để chứng minh toàn bộ quy trình chạy trơn tru từ đầu đến cuối:

Bạn sẽ thấy hai hàng trả về. Nếu chạy được, tệp cơ sở dữ liệu đã tồn tại, schema đã nằm trong đó và dữ liệu truy vấn được. Đó là toàn bộ câu chuyện "tạo cơ sở dữ liệu" với SQLite: không máy chủ, không người dùng, không bảng phân quyền. Chỉ là một tệp.

Tiếp theo: cơ sở dữ liệu trong bộ nhớ

Cùng lời gọi sqlite3.connect(...) dùng để tạo tệp, với đúng đối số, sẽ tạo ra một cơ sở dữ liệu không hề chạm tới ổ đĩa. Cơ sở dữ liệu trong bộ nhớ là cách nhanh nhất để chạy test, thử nghiệm schema hoặc giữ dữ liệu tạm thời. Đó là nội dung tiếp theo.

Câu hỏi thường gặp

Làm sao tạo cơ sở dữ liệu trong SQLite?

Chạy sqlite3 mydata.db trong shell. SQLite tạo tệp mydata.db nếu nó chưa tồn tại, và mở nó nếu đã có. Không có câu lệnh CREATE DATABASE riêng: cơ sở dữ liệu chính là tệp.

SQLite có lệnh CREATE DATABASE không?

Không. Khác với MySQL hay Postgres, SQLite không có câu lệnh SQL CREATE DATABASE. Cơ sở dữ liệu được tạo ngay khi bạn trỏ sqlite3 (hoặc một thư viện client như module sqlite3 của Python) tới một tên tệp chưa tồn tại.

Vì sao tệp cơ sở dữ liệu SQLite mới lại trống hoặc không thấy đâu?

SQLite rất lười: nó không thực sự ghi tệp xuống ổ đĩa cho tới khi bạn tạo bảng đầu tiên hoặc commit một giao dịch. Nếu bạn chỉ chạy sqlite3 mydata.db rồi thoát, sẽ không có tệp nào xuất hiện. Hãy tạo một bảng hoặc chạy .databases, tệp sẽ hiện ra.

Làm sao tạo cơ sở dữ liệu SQLite bằng Python?

Import module có sẵn sqlite3 và gọi sqlite3.connect('mydata.db'). Tệp được tạo tự động nếu chưa có. Dùng ':memory:' làm đường dẫn nếu muốn có một cơ sở dữ liệu tạm trong bộ nhớ.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu