Weaviate跨脚本添加数据报错'store is read-only'求助
问题描述
我通过Docker Compose部署Weaviate数据库,启动正常。在REPL或同一脚本内创建类并添加数据均成功,但将类创建代码移至单独文件/命令执行后,调用添加数据的函数时触发报错:
{'error': [{'message': 'store is read-only'}]}
已完成的测试:
- 单函数执行Weaviate快速入门教程,执行成功
- 在同一函数内创建
Message类并插入用户消息,执行成功 - 将类创建代码拆分到单独文件,数据添加逻辑保留在原文件,执行失败
复现流程:
- 执行
./build.sh setup_weaviate通过JSON文件创建类(执行成功),涉及文件包括build.sh、src/weaviate_client.py、resources/weaviate.json - 调用
message:handle_message函数尝试向Weaviate推送消息对象,触发上述报错 - 执行
client.schema.get()确认返回的schema与resources/weaviate.json内容完全一致
可能的解决思路
1. 检查客户端初始化模式
确认数据插入逻辑所在文件中的Weaviate客户端实例,是否被错误地以只读模式初始化。比如是否设置了read_only=True参数,或者环境变量中配置了WEAVIATE_READ_ONLY=true。
解决:确保数据插入用的客户端以读写模式初始化,移除所有强制只读的配置项。
2. 排查Docker容器权限与挂载问题
查看Docker Compose中Weaviate的volume挂载配置,检查执行类创建后,数据目录的权限是否发生变化,导致容器无法写入。
解决:
- 查看Weaviate容器日志:
docker logs <weaviate-container-id>,确认是否有权限相关报错 - 检查本地挂载目录的权限,确保容器运行用户(默认UID 1000)拥有读写权限
- 尝试重启Weaviate容器,重置运行状态
3. 等待类创建完成后的元数据初始化
类创建操作完成后,Weaviate可能需要短暂时间完成元数据同步,立即执行数据插入可能触发状态不一致问题(单节点模式下也可能存在初始化延迟)。
解决:在类创建完成后添加等待(如sleep 5),或者通过client.schema.exists("Message")轮询确认类完全就绪后,再执行数据插入。
4. 检查Schema配置中的隐含只读限制
对比同一脚本中成功创建的类定义,检查resources/weaviate.json中的类配置,是否存在误设置的只读属性(比如moduleConfig或vectorizer中的错误配置)。
解决:确保JSON文件中的类定义与同一脚本中成功运行的配置完全一致,移除任何可能限制写入的约束。
5. 统一客户端版本
检查两个文件中使用的weaviate-client版本是否一致,版本差异可能导致API兼容性问题,引发写入拦截。
解决:执行pip show weaviate-client确认版本,统一所有脚本的客户端包版本。
内容的提问来源于stack exchange,提问作者Brennan Tolman

