我正在尝试运行一个 python 脚本,该脚本使用 amazon linux 2 上的自托管 github 运行程序连接到 mongo atlas 数据库。但是在运行该脚本时,我收到错误
pymongo.errors.InvalidURI: Invalid URI scheme: URI must begin with 'mongodb://' or 'mongodb+srv://'
。
这是问题步骤的片段:
- name: Populate VectorDB
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
PINECONE_API_KEY: ${{ secrets.PINECONE_API_KEY }}
PINECONE_INDEX_NAME: ${{ needs.creates-ephemeral-env.outputs.pinecone_index_name }}
MONGODB_URI: ${{ needs.creates-ephemeral-env.outputs.mongodb_uri }}
MONGODB_USERNAME: ${{ secrets.MONGODB_USERNAME }}
MONGODB_PASSWORD: ${{ secrets.MONGODB_PASSWORD }}
MONGODB_NAME: ${{ env.MONGODB_NAME }}
run: |
cd database/scripts/populate_pinecone_db
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
python3 -u script.py
这是我的要求.txt:
pinecone-client==3.1.0
pymongo==4.4.0
langchain-openai==0.0.5
sql-metadata==2.8.0
uri 是有效的,因为我尝试在本地连接到数据库,并且当我使用相同的映像在 ec2 上启动单独的实例时,我能够使用相同的 uri 连接到 mongo 数据库。我还在前面的步骤中使用了
secrets.MONGODB_USERNAME
和 secrets.MONGODB_PASSWORD
,它们也有效。我不知道为什么 pymongo 会这样。
当我从 python 打印 uri 时,我得到以下信息:
"***[connect_uri].mongodb.net"
这是我的Python代码的一部分:
import os
import pymongo
from pinecone import Pinecone
from sql_metadata import Parser
pinecone_api_key = os.environ.get("PINECONE_API_KEY")
pinecone_index_name = os.environ.get("PINECONE_INDEX_NAME")
mongodb_uri = os.environ.get("MONGODB_URI")
mongodb_username = os.environ.get("MONGODB_USERNAME")
mongodb_password = os.environ.get("MONGODB_PASSWORD")
mongodb_name = os.environ.get("MONGODB_NAME")
if __name__ == "__main__":
connection_string = mongodb_uri.replace(
"mongodb+srv://", f"mongodb+srv://{mongodb_username}:{mongodb_password}@"
)
data_store = pymongo.MongoClient(connection_string)[mongodb_name]
...
Pymongo 应该成功连接到 mongo atlas 数据库,因为我已经配置了正确的网络访问以及用户名和密码
这很愚蠢,但我发现了,
needs.creates-ephemeral-env.outputs.mongodb_uri
的输出来自terraform,我将变量设置为mongodb_uri=$(terraform output appservice_name_dev)
,其中包含双引号作为字符串的一部分,因此连接uri无效。我不得不将其更改为$(terraform output -raw appservice_name_dev)
。