2010-09-17 11 views
8

Tôi có một số thử nghiệm chạy trên cơ sở dữ liệu MySQL được tải sẵn với các lược đồ và dữ liệu ví dụ từ một tập hợp các tệp SQL. Một số các thử nghiệm này, trong quá trình chạy của chúng, cũng tạo ra dữ liệu mới trong cơ sở dữ liệu.Làm thế nào để tìm các thay đổi trong một bảng liên quan đến một trận đấu SQL ban đầu?

Thông thường, các thử nghiệm có trách nhiệm tự dọn dẹp (và do đó không gây ô nhiễm môi trường cơ sở dữ liệu cho các thử nghiệm khác). Tuy nhiên, có vẻ như một số các thử nghiệm này không hoàn toàn làm như vậy, và do đó để lại các bản ghi bổ sung/sửa đổi mà chúng không nên làm.

Do bộ mã phức tạp đang được thử nghiệm, không thể có một giao dịch duy nhất chạy cho toàn bộ thử nghiệm, vì vậy tôi không thể chỉ có MySQL cuộn mọi thứ trở lại (có cả hai con trỏ và nhiều máy chủ DB được sao chép liên quan, trong số các yếu tố khác).

Tôi muốn có một cách dễ dàng hơn xác định những thử nghiệm này đang gây ô nhiễm DB, nhưng vì nó là cho phép đối với các bài kiểm tra ghi vào DB (miễn là họ loại bỏ những thứ sau đó), tôi có thể không chỉ xem xét tất cả các thay đổi đối với DB - tôi chỉ cần thay đổi hiệu quả, với các sửa đổi hủy bỏ đã bị xóa. Tôi nghĩ rằng nếu có một cách đơn giản để so sánh nội dung của một bảng với bảng khác, tôi có thể làm như vậy sau khi chạy từng thử nghiệm, so sánh nội dung của bảng được khởi tạo với vật cố với nội dung của bảng sau khi thử nghiệm.

+0

Một phương pháp mà chúng tôi đã sử dụng trong quá khứ là chỉ định giá trị âm cho các khóa chính dựa trên số. Rất dễ dàng để loại bỏ dữ liệu thử nghiệm: 'DELETE FROM TABLE WHERE id <0' –

+0

@OMG Ngựa vằn: Đó là một ý tưởng thông minh; Tôi không chắc liệu codebase của chúng ta có hỗ trợ điều đó hay không (có thể có một số 'x> 0' vân vân đang ngồi xung quanh), nhưng tôi chắc chắn sẽ ghi nhớ điều đó. – Amber

Trả lời

2

Một số gợi ý khác nhau mà tôi đã nhận được thông qua các kênh khác cho đến nay:

  • CHECKSUM TABLE - điều này sẽ là gần như hoàn hảo cho nhu cầu của tôi, ngoại trừ việc nó chỉ có tác dụng cho các bảng MyISAM (chúng tôi sử dụng InnoDB).

  • SHOW TABLE STATUS - điều này cung cấp Data_length, có thể hoạt động như một so sánh đơn giản. Nếu tôi không thể tìm thấy bất cứ điều gì tốt hơn, điều này có thể đủ.

+0

Tôi nghĩ rằng tôi sẽ đi với 'Data_length', vì nó cung cấp một sự cân bằng tốt giữa tốc độ và tính toàn diện. Nhờ những người cung cấp các tùy chọn khác mặc dù. – Amber

1

Trước khi thử nghiệm bạn có thể sao chép tất cả các bảng (tức là CREATE TABLE tmpTableA SELECT * FROM tableA) và sau đó tham gia chống lại họ sau khi các cuộc thử nghiệm để xem những gì các hàng mới có được sử dụng câu lệnh

SELECT a.* 
FROM tableA a 
LEFT JOIN tmpTableA as tmp on tmp.id=a.id 
WHERE tmp.id IS NULL 

Bạn cũng có thể làm một bãi chứa bảng trước khi thử nghiệm, sau đó sau khi kiểm tra, và sau đó làm một sự khác biệt trên hai bãi.

+0

Thật không may là cách tiếp cận JOIN không cho tôi biết nếu một hàng đã được sửa đổi, chỉ khi hàng mới được thêm vào. Cách tiếp cận khác biệt là một phần của một búa tạ, nhưng đó là một gợi ý tốt. :) – Amber