2010-02-18 37 views
7

Tôi đang sử dụng Python với MySQL và Django. Tôi tiếp tục nhìn thấy lỗi này và tôi không thể tìm ra nơi các ngoại lệ được ném:Ai đang ném (và bắt) ngoại lệ MySQL này?

Exception _mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now") in <bound method Cursor.__del__ of <MySQLdb.cursors.Cursor object at 0x20108150>> ignored

Tôi có nhiều "thử" và "ngoại lệ" khối trong mã của tôi - nếu ngoại lệ xảy ra trong một trong số đó, sau đó tôi sẽ thấy thông báo gỡ lỗi của riêng tôi. Ngoại lệ trên rõ ràng là bị bắt ở đâu đó vì chương trình của tôi không hủy bỏ khi ngoại lệ được ném.

Tôi rất bối rối, ai đó có thể giúp tôi không?

Trả lời

3

Đây là lỗi Python.

Xem: http://eric.lubow.org/2009/python/pythons-mysqldb-2014-error-commands-out-of-sync/

Dường như có một vấn đề với MySQLdb Query của bạn.

+1

cảm ơn liên kết. Tôi không sử dụng bất kỳ truy vấn MySQL rõ ràng nào hoặc sử dụng bất kỳ đối tượng con trỏ nào. Tất cả các truy vấn tôi đi qua các đối tượng Django. Một vấn đề lớn đối với tôi là không thể nhìn thấy nơi mà ngoại lệ này đang được ném ra. –

+0

Tiếp tục: Như trong php, bạn không thể mở kết nối mysql thứ hai mà không đóng kết nối đầu tiên! –

2

Tôi tin rằng lỗi này có thể xảy ra nếu bạn đang sử dụng cùng một kết nối/con trỏ từ nhiều luồng. Tuy nhiên, tôi không nghĩ rằng những người sáng tạo của Django đã phạm sai lầm như vậy, nhưng nếu bạn đang làm một cái gì đó của chính mình nó có thể dễ dàng xảy ra.

+0

Tôi không có đa luồng trong chương trình của mình, cũng chỉ có một phiên bản chương trình của tôi đang chạy. Tôi nên là người duy nhất truy cập vào cơ sở dữ liệu khi chương trình của tôi đang chạy. Có bất kỳ kỹ thuật gỡ lỗi nào để xem vị trí ngoại lệ được ném không? Tôi đã thiết lập chương trình của mình để chạy trên một tập dữ liệu lớn. Nếu tôi chỉ kiểm tra một tập hợp nhỏ dữ liệu, mọi thứ đều ổn. Nhưng khi tôi thiết lập nó để chạy trên toàn bộ thiết lập, ngoại lệ MySQL này xuất hiện ... Ngay bây giờ, tôi đang chạy toàn bộ và đường ống cả tiêu chuẩn và lỗi chuẩn để xem liệu tôi có thể có ý tưởng tốt hơn về nơi vấn đề đang hiển thị. –

2

Sau khi in ra một loạt các công cụ và gỡ lỗi, tôi đã tìm ra vấn đề tôi nghĩ. Một trong những thư viện mà tôi đã sử dụng không đóng kết nối hoặc con trỏ. Nhưng vấn đề này chỉ xuất hiện nếu tôi lặp qua một lượng lớn dữ liệu. Vấn đề cũng rất liên tục và tôi vẫn không biết ai đang ném "lệnh ra khỏi đồng bộ" ngoại lệ. Nhưng bây giờ chúng tôi đã đóng cả kết nối và con trỏ, tôi không thấy lỗi nữa.

4

Tôi đã có lỗi chính xác (sử dụng MySQLdb và Django) và phát hiện ra rằng lý do nó bị "bỏ qua" là nó xảy ra theo phương thức __del__. Trường hợp ngoại lệ trong __del__ đang khoát bỏ qua: object.__del__ datamodel

Hiện không có vẻ là cách nào để bắt nó từ xa hơn lên stack (ít nhất là theo this thread), nhưng bạn có thể chỉnh sửa MySQLdb/cursors.py hoặc monkey- vá để có được __del__ của riêng bạn trong đó bắt ngoại lệ và giọt bạn vào một dấu nhắc pdb hoặc đăng nhập một traceback đầy đủ.

+0

Bạn có bao giờ có thể xác định mã cụ thể đã gây ra lỗi cho bạn không? Tôi tự hỏi nếu có một vấn đề cụ thể với việc sử dụng mysql bên trong Django, một mô-đun phổ biến, hoặc mã của tôi nói riêng. –

+1

Vấn đề gốc hoàn toàn là lỗi của tôi (chia sẻ kết nối db giữa các luồng) và ngoại lệ xảy ra khi đóng kết nối, trong khi cố gắng xóa một tập kết quả. Chỉ đổ lỗi cho Django trong vấn đề là, như thường lệ, làm cho nó không thể gỡ lỗi khi bất cứ điều gì từ xa bất ngờ xảy ra. –

Các vấn đề liên quan