meilisync同步Postgres至MeiliSearch遇TypeError问题求助
解决meilisync同步PostgreSQL到MeiliSearch时的
TypeError: 'async for' requires an object with __aiter__ method错误 问题重现
同步PostgreSQL数据到MeiliSearch时触发以下错误和警告:
- 核心错误:
TypeError: 'async for' requires an object with __aiter__ method, got coroutine - 关联警告:
RuntimeWarning: coroutine 'Postgres.get_full_data' was never awaited
已尝试重建Docker容器、移除配置中的progress节点,问题仍未解决。
问题原因
这个错误本质是代码中在async for循环里直接调用了协程函数,而非该函数返回的异步迭代器。大概率是meilisync的Postgres适配器存在版本bug,导致get_full_data方法没有正确返回异步迭代器,而是返回了未执行的协程对象。
解决方案
1. 锁定meilisync稳定版本
避免使用latest镜像标签,改用明确的稳定版本(比如v0.1.10,可查看官方仓库确认最新稳定版),旧版本的异步迭代器实现可能存在问题。修改docker-compose.yml中meilisync的镜像配置:
meilisync: image: getmeili/meilisync:v0.1.10 # 替换为最新稳定版 volumes: - ./meilisync_config.yml:/app/config.yml depends_on: - meilisearch - postgres
2. 检查并调整同步策略
如果全量同步触发问题,先尝试关闭全量同步,改用增量同步验证:
在meilisync_config.yml中设置full_sync: false:
sync: - table: your_table index: your_index full_sync: false
待增量同步正常后,再手动触发全量同步(可通过临时修改配置为full_sync: true并重启容器实现)。
3. 核对依赖版本(非Docker部署场景)
如果是直接通过pip安装meilisync,确保依赖库版本符合要求,比如asyncpg版本需适配meilisync的版本。执行以下命令安装指定版本:
pip install meilisync==0.1.10 asyncpg==0.27.0
4. 检查自定义适配器(如有)
如果是自定义了Postgres适配器,确保get_full_data方法通过yield返回异步迭代器,示例正确写法:
async def get_full_data(self): async with self.pool.acquire() as conn: async for record in conn.cursor("SELECT * FROM your_table"): yield record
附:参考配置示例
meilisync_config.yml
meilisearch: url: http://meilisearch:7700 api_key: your_master_key postgres: dsn: postgresql://user:password@postgres:5432/your_db sync: - table: users index: users_index full_sync: false
docker-compose.yml
version: '3.8' services: meilisearch: image: getmeili/meilisearch:v1.6.0 environment: MEILI_MASTER_KEY: your_master_key ports: - "7700:7700" meilisync: image: getmeili/meilisync:v0.1.10 volumes: - ./meilisync_config.yml:/app/config.yml depends_on: - meilisearch - postgres postgres: image: postgres:15-alpine environment: POSTGRES_USER: user POSTGRES_PASSWORD: password POSTGRES_DB: your_db volumes: - postgres_data:/var/lib/postgresql/data volumes: postgres_data:
内容的提问来源于stack exchange,提问作者An Zhiwei
相关产品推荐
相关产品推荐

