2011-12-07 28 views
6

Có cách nào để kết nối với mongodb qua ổ cắm unix trong python hay không, trong khi mô-đun pymongo chính thức chưa hỗ trợ ổ cắm unix.Cách kết nối với mongodb qua ổ cắm unix trong python

Tôi muốn có bất kỳ lựa chọn thay thế hoặc bản vá lỗi của bên thứ ba nào, trong khi tôi đã tìm kiếm và không tìm thấy.

Tôi không thích thư viện kiểu ORM vì mongodb => python dicts là tự nhiên và dễ sử dụng, vì vậy tôi không tính đến tài khoản MongoEngine.

Trả lời

7

MongoDB, theo mặc định, tạo ra một ổ cắm unix tại /tmp/mongodb-27017.sock. Tính đến pymongo 2.4 bạn có thể làm cho một kết nối như thế này:

from pymongo import MongoClient 
CONNECTION = MongoClient('/tmp/mongodb-27017.sock') 

Ngoài ra bạn có thể vô hiệu hóa hành vi này bằng cách bắt đầu mongod với --nounixsocket hoặc chỉ định một vị trí thay thế với --unixSocketPrefix <path>

MongoDB sẽ luôn tạo ra và lắng nghe trên UNIX socket, trừ khi --nounixsocket được đặt, --bind_ip không được đặt hoặc --bind_ip chỉ định 127.0.0.1.

+0

Vì vậy, điều này cuối cùng đã được thực hiện kể từ pymongo 2.4. Cảm ơn bạn! –

+0

Nói, "như của pymongo 2.4". Là pymongo một trong những tạo ra các ổ cắm unix? Hoặc là "' ... vớ ". Như pymongo 2.4, bạn có thể tạo kết nối ..." –

+0

Chỉnh sửa để rõ ràng, cảm ơn bạn. –

1

Ngoài phạm vi của Python, bạn có thể tạo proxy giữa ổ cắm TCP/IP và ổ cắm miền unix. Vì vậy, bạn vẫn có thể sử dụng pymongo

Hoặc là netcat hoặc socat có thể thực hiện việc này.

nc -l 1234 | nc -U /tmp/foo 

hoặc

socat TCP-LISTEN:1234,reuseaddr,fork UNIX-CLIENT:/tmp/foo 

Xem thêm:

Redirecting TCP-traffic to a UNIX domain socket under Linux

+1

Cảm ơn bạn dù sao, nhưng đây không phải là chính xác những gì tôi muốn :) Tôi muốn sử dụng unix ổ cắm cho hiệu suất và sự ổn định, nhưng nếu tôi xây dựng một proxy trong TCP và chuyển tiếp truy vấn hai mục tiêu đều bị thiếu. –

6

Cập nhật cho MongoDB v3.x

Nếu bạn nâng cấp lên MongoDB 3.x trên Linux, các nhóm và các quyền khác trên /tmp/mongodb-27017.sock đã được gỡ bỏ. Bạn sẽ nhận được quyền từ chối lỗi khi bạn kết nối bằng MongoClient (host = '/ tmp/mongodb-27017.sock')

Để khắc phục điều này, hãy nâng cấp tệp cấu hình MongoDB của bạn lên định dạng YAML, bao gồm tùy chọn tệpPermissions để bạn đặt các quyền trở lại.

Ví dụ /etc/mongod.conf ở định dạng YAML:

storage: 
    dbPath: "/var/lib/mongodb" 
systemLog: 
    destination: file 
    path: "/var/log/mongodb/mongod.log" 
    logAppend: true 
net: 
    unixDomainSocket: 
     filePermissions: 0777 
Các vấn đề liên quan