python 如何更新Pydantic中的设置变量后,从.env文件得到它?

bkhjykvo  于 2023-01-16  发布在  Python
关注(0)|答案(1)|浏览(199)

我想使用Heroku和Heroku Postgres部署FastAPI应用程序。不幸的是,Heroku部署数据库URL以postgres://开头,而SQLAlchemy现在只允许postgresql://。因此,我想直接在应用程序本身中更新DATABASE_URL变量。
我试着手动更新它,至于Pydantic中的several建议:

def get_database_url(url):
    if url.startswith("postgres://"):
        url = url.replace("postgres://", "postgresql://", 1)
    return URL

#attempt 1
class Settings(BaseSettings):
    load_dotenv()

    DATABASE_URL: str = get_database_url(os.getenv("DATABASE_URL"))

#attempt 2
class Settings(BaseSettings):
    ...

    class Config:
        @validator("DATABASE_URL", pre=True)
        def parse_env_var(cls, value: str):
            return get_database_url(value)

#attempt 3
class Settings(BaseSettings):
    ...

    class Config:
        @classmethod
        def parse_env_var(cls, field_name: str, raw_val: str) -> Any:
            if field_name == 'DATABASE_URL':
                return get_database_url(raw_val)
            return cls.json_loads(raw_val)

所有这些都给予相同的错误:

sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:postgres

从环境文件中获取该值后,如何更新该值?

8yparm6h

8yparm6h1#

问题出在SQLAlchemy上,而不是您指定或获取URL的方式。
如果SQLAlchemy删除了对"postgres://"的支持,请查看以下信息:sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:postgres
你可以试试这个:postgresql + psycopg2://

相关问题