2012-04-18 31 views
24

Tôi đang ấn tượng rằng các cuộc gọi cơ sở dữ liệu thông qua SQLAlchemy sẽ chặn và không phù hợp để sử dụng trong bất kỳ thứ gì khác ngoài mã đồng bộ. Tôi có đúng không (tôi hy vọng là không!) Hoặc có cách nào để cấu hình nó không bị chặn không?SQLAlchemy có thể được định cấu hình để không bị chặn không?

+1

Câu trả lời ngắn gọn, không. Đó là các thư viện cơ sở dữ liệu đang chặn, chứ không phải chính SQLalchemy. Tuy nhiên, không có gì ngăn bạn làm công cụ DB trong một chuỗi riêng biệt. – AdamKG

+2

@AdamKG Điều này có lẽ phải là câu trả lời chứ không phải là nhận xét! :-) – Matty

Trả lời

24

Bạn có thể sử dụng SQLA theo kiểu không chặn bằng cách sử dụng gevent. Dưới đây là một ví dụ sử dụng psycopg2, sử dụng psycopg2 của coroutine support: folks

https://bitbucket.org/zzzeek/green_sqla/

Tôi cũng nghe nói sử dụng ý tưởng cùng với pymysql. Vì pymysql là trong Python thuần túy và sử dụng thư viện ổ cắm, gevent vá các thư viện socket là không đồng bộ.

+0

Tuyệt vời! Cảm ơn bạn. Có bất kỳ cảnh báo nào mà tôi cần biết (không xuất hiện trong tài liệu) khi sử dụng nó theo cách này không? – Matty

+1

không chắc chắn. tôi tìm thấy nó dường như làm việc tốt hơn bằng cách sử dụng NullPool, mà vô hiệu hóa tổng hợp. Nếu không một cái gì đó đã làm cho nó treo. Vì vậy, có thể tiến hành thận trọng để bắt đầu với .. – zzzeek

+3

@zzzeek Treo máy của bạn có thể đến từ hồ bơi mặc định của SQLAlchemy (QueuePool) bằng cách sử dụng luồng không được vá khỉ. Áp dụng bản vá khỉ của gevent hoặc tạo phiên bản màu xanh lục của QueuePool theo ví dụ tại https://groups.google.com/forum/#!msg/gevent/533wzrnL0Fs/ijL34u5prYIJ. Điều đó cố định cùng một hành vi khi tôi có nó. – CryingCyclops

6

Hãy xem Tornado vì chúng có một số thư viện không chặn gọn gàng, đặc biệt là tornado.gen.

Chúng tôi sử dụng cùng với Momoko, một trình bao bọc psycopg không chặn của Tornado. Nó đã được tuyệt vời cho đến nay. Có lẽ nhược điểm duy nhất là bạn mất tất cả các đối tượng mô hình mà SQLAlchemy cung cấp cho bạn. Hiệu suất là không thực tế mặc dù.

+0

Tôi đã nhìn Tornado và tôi cũng có thể đi xuống con đường đó. Có lẽ tôi nên viết một số mã demo để kiểm tra điều này, nhưng nếu trình điều khiển psycopg hỗ trợ các cuộc gọi cơ sở dữ liệu không đồng bộ (có vẻ như nó), tôi cho rằng có thể thực hiện các cuộc gọi DB không chặn với SQLAlchemy. – Matty

+0

@Matty Ý tưởng hay, tôi rất muốn nghe bạn đi với nó như thế nào. Một trong những vấn đề chính tôi tưởng tượng bạn sẽ nhấn với SQLAlchemy là không biết chính xác khi nào một cuộc gọi chặn sẽ được thực hiện. Tất nhiên bạn luôn có thể đi sâu vào mã để tìm ra khi nào ruột của tôi nói rằng đó sẽ là rất nhiều công việc. – kuhnza

+0

@Kahunza Sau khi xem nhanh các tài liệu cho psycopg2, có vẻ như có một đối số có thể được đưa vào chuỗi kết nối được chuyển tới hàm 'create_engine()' của SQLAlchemy. Có lẽ một trong những người bảo trì sẽ kêu vang hoặc tôi sẽ yêu cầu danh sách của họ. Chúc mừng! – Matty

1

Nếu không có sự trợ giúp của greenlet, câu trả lời là không, trong ngữ cảnh của asyncio.

Tuy nhiên, chỉ có thể sử dụng một phần của SQLAlchemy trong asyncio. Hãy tìm ví dụ trong GINO project, trong đó chúng tôi chỉ sử dụng lõi SQLAlchemy không có động cơ và ngữ cảnh thực thi đầy đủ để tạo một ORM đơn giản trong asyncio.

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