PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chế độ postgresql H2 dường như không hoạt động với tôi

Vì vậy, tôi đã nghĩ đến việc sử dụng chế độ tương thích H2 PosgreSQL bằng cách nghĩ rằng tất cả các truy vấn postgres sẽ hoạt động trên H2, vui lòng sửa cho tôi nếu tôi sai

Tôi e rằng điều đó không đúng.

H2 cố gắng mô phỏng cú pháp PostgreSQL và hỗ trợ một vài tính năng và tiện ích mở rộng. Nó sẽ không bao giờ phù hợp hoàn toàn với hành vi của PostgreSQL và không hỗ trợ tất cả các tính năng.

Các tùy chọn duy nhất bạn có là:

  • Sử dụng PostgreSQL trong thử nghiệm; hoặc
  • Ngừng sử dụng các tính năng không được H2 hỗ trợ

Tôi đề nghị sử dụng Pg để thử nghiệm. Tương đối đơn giản để viết một khai thác thử nghiệm mà initdb là một phiên bản postgres và khởi chạy nó để thử nghiệm rồi gỡ bỏ nó sau đó.

Cập nhật dựa trên nhận xét:

Không có ranh giới cứng giữa các bài kiểm tra "đơn vị" và "tích hợp". Trong trường hợp này, H2 cũng là một thành phần bên ngoài. Các bài kiểm tra đơn vị thuần túy sẽ có một phản hồi giả cho các truy vấn như một phần của bộ khai thác kiểm tra. Kiểm tra đối với H2 cũng giống như kiểm tra "tích hợp" giống như kiểm tra đối với PostgreSQL. Thực tế là nó đang trong quá trình và trong bộ nhớ là một sự tiện lợi, nhưng không đáng kể về mặt chức năng.

Nếu bạn muốn kiểm tra đơn vị bạn nên viết một mục tiêu cơ sở dữ liệu khác cho ứng dụng của mình để đi cùng với các mục tiêu "PostgreSQL", "SybaseIQ", v.v. Gọi nó, nói, "MockDatabase". Điều này sẽ chỉ trả lại kết quả mong đợi từ các truy vấn. Nó không thực sự chạy các truy vấn, nó chỉ tồn tại để kiểm tra hành vi của phần còn lại của mã.

Cá nhân tôi nghĩ đó là một sự lãng phí thời gian khổng lồ, nhưng đó là những gì một người theo chủ nghĩa kiểm thử đơn vị sẽ làm để tránh đưa các phụ thuộc bên ngoài vào khai thác kiểm tra.

Nếu bạn khăng khăng muốn có các bài kiểm tra đơn vị (trái ngược với tích hợp) cho các thành phần DB của mình nhưng không thể / không viết giao diện giả, thay vào đó bạn phải tìm cách sử dụng một giao diện hiện có. H2 sẽ là một ứng cử viên hợp lý cho điều này - nhưng bạn sẽ phải viết một phần phụ trợ mới với một bộ truy vấn mới hoạt động cho H2, bạn không thể chỉ sử dụng lại phần phụ trợ PostgreSQL của mình. Như chúng tôi đã thiết lập, H2 không hỗ trợ tất cả các tính năng bạn cần để sử dụng với PostgreSQL, vì vậy bạn sẽ phải tìm các cách khác nhau để thực hiện những điều tương tự với H2. Một tùy chọn sẽ là tạo một cơ sở dữ liệu H2 đơn giản với các kết quả "mong đợi" và các truy vấn đơn giản trả về các kết quả đó, hoàn toàn bỏ qua lược đồ của ứng dụng thực. Nhược điểm thực sự duy nhất ở đây là việc duy trì có thể là một khó khăn lớn ... nhưng đó là thử nghiệm đơn vị.

Cá nhân tôi chỉ muốn thử nghiệm với PostgreSQL. Trừ khi tôi đang kiểm tra các lớp hoặc mô-đun riêng lẻ đứng riêng lẻ như các đơn vị được xác định rõ có giao diện hẹp, tôi không quan tâm liệu ai đó gọi nó là kiểm tra "đơn vị" hay "tích hợp". Tôi sẽ kiểm tra đơn vị, chẳng hạn, các lớp xác thực dữ liệu. Đối với giao diện cơ sở dữ liệu, kiểm tra đơn vị thuần túy nhất có rất ít ý nghĩa và tôi sẽ chỉ thực hiện kiểm tra tích hợp.

Mặc dù có một cơ sở dữ liệu trong bộ nhớ trong quá trình là thuận tiện cho việc đó, nhưng nó không bắt buộc. Bạn có thể viết dây kiểm tra của mình để mã thiết lập initdb là một PostgreSQL mới và khởi chạy nó; sau đó mã teardown giết người quản lý bưu điện và xóa datadir. Tôi đã viết thêm về điều này trong câu trả lời này.

Xem thêm:

  • Chỉ chạy PostgreSQL trong bộ nhớ

Đối với:

Nếu tất cả các truy vấn với bộ dữ liệu kết thúc dự kiến ​​hoạt động tốt trong Hậu kỳ, tôi có thể cho rằng nó sẽ hoạt động tốt trong tất cả các db khác

Nếu tôi hiểu những gì bạn đang nói một cách chính xác thì có, đó là trường hợp - nếu phần còn lại của mã của bạn hoạt động với tập dữ liệu từ PostgreSQL, nó thường hoạt động tương tự với tập dữ liệu chứa cùng dữ liệu từ cơ sở dữ liệu khác. Tất nhiên, miễn là nó sử dụng các kiểu dữ liệu đơn giản không phải các tính năng cụ thể của cơ sở dữ liệu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách Tan () hoạt động trong PostgreSQL

  2. Hàm với truy vấn SQL không có đích cho dữ liệu kết quả

  3. Hai SQL LEFT JOINS tạo ra kết quả không chính xác

  4. Lỗi Heroku PostgreSQL GROUP_BY trong ứng dụng Rails

  5. Lỗi drop Rails + Postgres:cơ sở dữ liệu đang được người dùng khác truy cập