如何通过unix套接字在Python中连接MongoDB

8 投票
3 回答
8465 浏览
提问于 2025-04-17 07:52

有没有办法在Python中通过Unix套接字连接到MongoDB,因为官方的pymongo模块还不支持Unix套接字。

我希望能找到一些第三方的替代方案或者补丁,我搜索了一圈也没找到。

我不喜欢ORM风格的库,因为MongoDB和Python字典之间的转换很自然,也很简单,所以我没有考虑像MongoEngine这样的东西。

3 个回答

1

在Python之外,你可以在TCP/IP套接字和Unix域套接字之间建立一个代理。这样,你就可以继续使用pymongo了。

你可以使用netcat或者socat来实现这个功能。

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

或者

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

另外,你可以查看:

在Linux下将TCP流量重定向到Unix域套接字

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

撰写回答