如何使用Python连接Snap部署的Nextcloud内置MySQL数据库
环境说明
- 操作系统:Ubuntu Server 20.04
- Nextcloud部署方式:Snap包安装,项目仓库:nextcloud-snap
- 可用CLI连接命令:
sudo nextcloud.mysql-client -S /tmp/sockets/mysql.sock - 现存问题:需要通过Python直连内置MySQL执行SELECT查询,此前
subprocess.check_output调用CLI的方案稳定性差,无可用直连方案
实现方案
Snap版Nextcloud内置的MySQL默认不暴露TCP端口,仅通过Unix Socket提供访问,按照以下步骤即可实现Python直连:
获取数据库认证信息
执行以下命令直接从Nextcloud配置中读取数据库账号、密码、库名,无需手动翻配置文件:sudo nextcloud-occ config:system:get dbuser dbpassword dbname命令按顺序输出三个值:数据库用户名、数据库密码、数据库名,默认值分别为
nextcloud、随机生成的强密码、nextcloud。安装Python MySQL驱动
选择任意支持Unix Socket连接的MySQL驱动即可,以常用的pymysql为例:pip install pymysql配置Socket访问权限
/tmp/sockets/mysql.sock默认仅允许root用户和Snap Nextcloud运行组访问,将运行Python脚本的用户加入对应用户组即可免sudo访问,执行后需重新登录会话生效:sudo usermod -aG snap_nextcloud <你的脚本运行用户名>临时测试阶段也可直接用sudo运行Python脚本跳过权限配置。
编写连接代码
连接时不要配置host、port参数,直接指定Unix Socket路径即可,参考示例:import pymysql # 替换为第一步获取的实际配置 db_conf = { "unix_socket": "/tmp/sockets/mysql.sock", "user": "nextcloud", "password": "第一步查到的数据库密码", "database": "nextcloud", "charset": "utf8mb4", "cursorclass": pymysql.cursors.DictCursor } conn = pymysql.connect(**db_conf) try: with conn.cursor() as cur: # 替换为实际需要执行的SELECT语句 cur.execute("SELECT uid, displayname FROM oc_users LIMIT 10") query_result = cur.fetchall() print(query_result) finally: conn.close()
注意事项
- 不要尝试通过127.0.0.1:3306连接,Snap版内置MySQL默认未开启TCP监听,会直接报连接拒绝
- 生产环境不要将数据库密码硬编码在脚本中,可直接解析
/var/snap/nextcloud/current/nextcloud/config/config.php读取配置,或通过环境变量传入敏感信息 - 若查询Nextcloud业务表,注意表前缀和你在CLI中查到的保持一致,默认前缀为
oc_,如果安装时自定义过前缀请对应替换
内容的提问来源于stack exchange,提问作者Mikhail Bozhnev
相关产品推荐
相关产品推荐

