2012-12-20 9 views
8

Tôi đang sử dụng SQLAlchemy với Flask như ở đây: http://flask.pocoo.org/docs/patterns/sqlalchemy/SQLAlchemy DB phiên với Flask, Postgres

Tôi có một bộ kiểm tra Selenium rằng đầu tiên chạy với Firefox và sau đó với Chrome.

Trước khi bắt đầu kiểm tra trên mỗi trình duyệt, các bảng trong cơ sở dữ liệu kiểm tra (PostgreSQL) bị loại bỏ và tạo ra.

Trình duyệt này chạy hoàn hảo cho các trình duyệt đầu tiên, nhưng đối với trình duyệt thứ hai, nỗ lực tạo/thả SQL chỉ bị đóng băng và không có lỗi nào được hiển thị.

Tôi tin rằng điều này là do các phiên SQLAlchemy mở, đúng không?

+2

đặt dấu vết ngăn xếp tại đây –

Trả lời

3

Tôi tin rằng điều này là do các phiên SQLAlchemy mở, đúng không?

Điều đó rất có thể xảy ra. Để xác nhận, hãy kết nối với cơ sở dữ liệu postgres và chạy SELECT * FROM pg_stat_activity;

Tôi không chắc chắn làm thế nào bạn xử lý việc tạo DB/thả nhưng bạn có thể muốn gọi dispose() và có thể recreate() trên hồ bơi kết nối SQLAlchemy, sau khi đảm bảo rằng bất kỳ kiểm tra ra kết nối đã được trả lại (ví dụ, với session.close()).

+0

Giải pháp tạm thời cho tôi là tắt các giao dịch, tức là 'autocommit = True' dưới dạng tham số' engine'. – Sri

+0

Thú vị. Tôi nghĩ rằng với autocommit phiên trả về kết nối ngay lập tức vào hồ bơi. Tôi cho rằng giữa hai lần kiểm tra liên tiếp, động cơ và bể bơi của bạn là rác được thu gom, đúng không? Sau đó, điều đó có nghĩa là bạn có một hoặc nhiều giao dịch mở tại thời điểm động cơ của bạn bị phá hủy, mỗi công cụ sẽ giữ một kết nối mở cho máy chủ PG. –

0

Đây cũng là điều xảy ra với tôi khi chạy Flask unittest với SQLAlchemy và Postgres. Nhiều lần, thủ phạm là một ngoại lệ, mà không lan truyền lên trên và bị mắc kẹt. Ngoại lệ này cũng dừng kiểm tra từ việc dọn dẹp đúng cách và do đó đóng băng.

Nếu bạn đang tạo bộ thử nghiệm, hãy gọi phương thức gỡ lỗi trên bộ đồ và nó sẽ hiển thị ngoại lệ. Đã liên kết các tài liệu của phương thức này here.

Quan sát của bạn về phiên Sqlalchemy mở cũng có thể là lý do. Tôi sẽ kiểm tra lý thuyết của tôi dựa trên quan sát này vào ngày mai. Nếu nó xóa một số nghi ngờ thì tôi sẽ đăng ở đây.

Nhìn vào điều này answer hiển thị cách bạn có thể kích hoạt trình gỡ lỗi ngoại lệ. Có lẽ nó có thể giúp xác định vấn đề.

+0

Đối với tôi đó là một giao dịch không rõ ràng. Sử dụng 'autocommit = True' trên' engine' của tôi đã khắc phục vấn đề bằng cách không làm việc thông qua các giao dịch trên postgres. Không chắc chắn nếu đây là một giải pháp lâu dài. – Sri

+0

'autocommit = True' có thể thỏa hiệp tính nhất quán của dữ liệu của bạn, tùy thuộc vào ứng dụng của bạn. –