如何通过unix套接字在Python中连接MongoDB
有没有办法在Python中通过Unix套接字连接到MongoDB,因为官方的pymongo模块还不支持Unix套接字。
我希望能找到一些第三方的替代方案或者补丁,我搜索了一圈也没找到。
我不喜欢ORM风格的库,因为MongoDB和Python字典之间的转换很自然,也很简单,所以我没有考虑像MongoEngine这样的东西。
3 个回答
1
在Python之外,你可以在TCP/IP套接字和Unix域套接字之间建立一个代理。这样,你就可以继续使用pymongo了。
nc -l 1234 | nc -U /tmp/foo
或者
socat TCP-LISTEN:1234,reuseaddr,fork UNIX-CLIENT:/tmp/foo
另外,你可以查看:
7
关于MongoDB v3.x的更新
如果你在Linux上升级到MongoDB 3.x,/tmp/mongodb-27017.sock这个文件的组权限和其他权限会被移除。这样的话,当你用MongoClient连接这个文件时,就会出现权限被拒绝的错误。
要解决这个问题,你需要把MongoDB的配置文件升级到YAML格式,这样你就可以设置文件的权限了。
下面是一个YAML格式的/etc/mongod.conf文件示例:
storage:
dbPath: "/var/lib/mongodb"
systemLog:
destination: file
path: "/var/log/mongodb/mongod.log"
logAppend: true
net:
unixDomainSocket:
filePermissions: 0777
9
MongoDB 默认会在 /tmp/mongodb-27017.sock
这个位置创建一个 unix 套接字。自从 pymongo 2.4 版本开始,你可以这样建立连接:
from pymongo import MongoClient
CONNECTION = MongoClient('/tmp/mongodb-27017.sock')
另外,你可以通过在启动 mongod 时加上 --nounixsocket
来关闭这个功能,或者用 --unixSocketPrefix <path>
来指定一个不同的位置。
MongoDB 会一直创建并监听一个 UNIX 套接字,除非你设置了 --nounixsocket
,或者没有设置 --bind_ip
,或者 --bind_ip
指定了 127.0.0.1
。