(Chuyển câu trả lời của tôi từ Sử dụng PostgreSQL trong bộ nhớ và tổng quát hóa nó):
Bạn không thể chạy Pg trong quá trình, trong bộ nhớ
Tôi không thể tìm ra cách chạy cơ sở dữ liệu Postgres trong bộ nhớ để thử nghiệm. Nó có khả thi không?
Không, no không thể. PostgreSQL được triển khai bằng C và được biên dịch sang mã nền tảng. Không giống như H2 hoặc Derby, bạn không thể chỉ tảijar
và kích hoạt nó như một DB trong bộ nhớ.
Không giống như SQLite, cũng được viết bằng C và được biên dịch sang mã nền tảng, PostgreSQL cũng không thể được tải trong quá trình. Nó yêu cầu nhiều quy trình (một quy trình trên mỗi kết nối) vì đó là kiến trúc đa xử lý, không phải đa luồng. Yêu cầu đa xử lý có nghĩa là bạn phải khởi chạy quản trị viên bưu điện như một quy trình độc lập.
Thay vào đó: định cấu hình trước một kết nối
Tôi khuyên bạn chỉ cần viết các bài kiểm tra của mình để mong đợi một tên máy chủ / tên người dùng / mật khẩu cụ thể hoạt động và có bài kiểm tra khai thác CREATE DATABASE
một cơ sở dữ liệu hữu ích, sau đóDROP DATABASE
vào cuối quá trình chạy. Lấy chi tiết kết nối cơ sở dữ liệu từ tệp thuộc tính, xây dựng thuộc tính đích, biến môi trường, v.v.
Thật an toàn khi sử dụng phiên bản PostgreSQL hiện có mà bạn đã có cơ sở dữ liệu mà bạn quan tâm, miễn là người dùng bạn cung cấp cho các bài kiểm tra đơn vị của mình không phải là superuser, chỉ là người dùng có CREATEDB
quyền. Tệ nhất là bạn sẽ tạo ra các vấn đề về hiệu suất trong các cơ sở dữ liệu khác. Tôi thích chạy một bản cài đặt PostgreSQL hoàn toàn biệt lập để thử nghiệm vì lý do đó.
Thay vào đó: Khởi chạy một phiên bản PostgreSQL mới để thử nghiệm
Ngoài ra, nếu bạn thực sự quan tâm, bạn có thể yêu cầu bộ khai thác thử nghiệm của mình xác định vị trí initdb
và postgres
mã nhị phân, chạy initdb
để tạo cơ sở dữ liệu, sửa đổi pg_hba.conf
thành trust
, chạy postgres
để khởi động nó trên một cổng ngẫu nhiên, tạo người dùng, tạo DB và chạy thử nghiệm . Bạn thậm chí có thể gói các tệp nhị phân PostgreSQL cho nhiều kiến trúc trong một jar và giải nén các tệp cho kiến trúc hiện tại vào một thư mục tạm thời trước khi chạy thử nghiệm.
Cá nhân tôi nghĩ đó là một nỗi đau lớn cần phải tránh; thật dễ dàng hơn khi chỉ cần cấu hình một DB thử nghiệm. Tuy nhiên, nó trở nên dễ dàng hơn một chút với sự ra đời của include_dir
hỗ trợ trong postgresql.conf
; bây giờ bạn chỉ có thể nối một dòng, sau đó viết tệp cấu hình đã tạo cho tất cả phần còn lại.
Kiểm tra nhanh hơn với PostgreSQL
Để biết thêm thông tin về cách cải thiện an toàn hiệu suất của PostgreSQL cho mục đích thử nghiệm, hãy xem câu trả lời chi tiết mà tôi đã viết về chủ đề này trước đó: Tối ưu hóa PostgreSQL để kiểm tra nhanh
Phương ngữ PostgreSQL của H2 không phải là một sự thay thế thực sự
Thay vào đó, một số người sử dụng cơ sở dữ liệu H2 ở chế độ phương ngữ PostgreSQL để chạy thử nghiệm. Tôi nghĩ điều đó cũng tệ như những người Rails sử dụng SQLite để thử nghiệm và PostgreSQL để triển khai sản xuất.
H2 hỗ trợ một số phần mở rộng PostgreSQL và mô phỏng phương ngữ PostgreSQL. Tuy nhiên, nó chỉ là - một giả lập. Bạn sẽ tìm thấy những nơi H2 chấp nhận một truy vấn nhưng PostgreSQL không, nơi khác hành vi, vv . Bạn cũng sẽ tìm thấy rất nhiều nơi mà PostgreSQL hỗ trợ thực hiện điều gì đó mà H2 không thể - như các hàm cửa sổ, tại thời điểm viết bài.
Nếu bạn hiểu những hạn chế của phương pháp này và truy cập cơ sở dữ liệu của bạn đơn giản, H2 có thể ổn. Nhưng trong trường hợp đó, bạn có thể là ứng cử viên tốt hơn cho một ORM tóm tắt cơ sở dữ liệu vì dù sao thì bạn cũng không sử dụng các tính năng thú vị của nó - và trong trường hợp đó, bạn không còn phải quan tâm đến tính tương thích của cơ sở dữ liệu nữa.
Bàn phím không phải là câu trả lời!
Đừng không sử dụng một bảng để tạo ra một "trong bộ nhớ" cơ sở dữ liệu. Nó không chỉ là không cần thiết vì dù sao thì nó cũng sẽ không giúp hiệu suất đáng kể mà còn là một cách tuyệt vời để làm gián đoạn quyền truy cập vào bất kỳ thứ gì khác mà bạn có thể quan tâm trong cùng một bản cài đặt PostgreSQL. Tài liệu 9.4 hiện có cảnh báo sau :
CẢNH BÁO
Mặc dù nằm bên ngoài thư mục dữ liệu PostgreSQL chính, không gian bảng là một phần không thể thiếu của cụm cơ sở dữ liệu và không thể được coi là một tập hợp các tệp dữ liệu tự trị. Chúng phụ thuộc vào siêu dữ liệu có trong thư mục dữ liệu chính và do đó không thể được đính kèm vào một cụm cơ sở dữ liệu khác hoặc được sao lưu riêng lẻ. Tương tự, nếu bạn mất một vùng bảng (xóa tệp, hỏng đĩa, v.v.), cụm cơ sở dữ liệu có thể không đọc được hoặc không thể khởi động. Đặt một vùng bảng trên một hệ thống tệp tạm thời như đĩa ram có nguy cơ ảnh hưởng đến độ tin cậy của toàn bộ cụm.
bởi vì tôi nhận thấy có quá nhiều người đang làm điều này và gặp rắc rối.
(Nếu bạn đã làm điều này, bạn có thể mkdir
thư mục không gian bảng bị thiếu để PostgreSQL bắt đầu lại, sau đó DROP
các cơ sở dữ liệu, bảng bị thiếu, v.v. Tốt hơn là không nên làm điều đó.)