SQLAlchemy 错误:无法从字符串解析 SQLAlchemy URL

问题描述 投票:0回答:1

我无法使用 SQLAlchemy 连接到我的数据库。它会抛出一个错误:

E   sqlalchemy.exc.ArgumentError: Could not parse SQLAlchemy URL from string '
E   postgresql://[my_username]:[my_password]@localhost:5432/tugas1-law-db"

这是我在FastAPI上的database.py实现,它严格遵循FastAPI官方指南:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base

import os
from dotenv import load_dotenv

load_dotenv()

# SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
SQLALCHEMY_DATABASE_URL = f"""
postgresql://[my_username]:{os.environ["POSTGRES_PASSWORD"]}@localhost:5432/tugas1-law-db"
"""

engine = create_engine(
    SQLALCHEMY_DATABASE_URL
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

这是完整的错误堆栈:

ImportError while loading conftest '/home/[my_username]/notebin/test/conftest.py'.
test/conftest.py:16: in <module>
    from database import Base, get_db
database.py:14: in <module>
    engine = create_engine(
env/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py:281: in warned
    return fn(*args, **kwargs)  # type: ignore[no-any-return]
env/lib/python3.10/site-packages/sqlalchemy/engine/create.py:546: in create_engine
    u = _url.make_url(url)
env/lib/python3.10/site-packages/sqlalchemy/engine/url.py:842: in make_url
    return _parse_url(name_or_url)
env/lib/python3.10/site-packages/sqlalchemy/engine/url.py:908: in _parse_url
    raise exc.ArgumentError(
E   sqlalchemy.exc.ArgumentError: Could not parse SQLAlchemy URL from string '
E   postgresql://[my_username]:[my_password]@localhost:5432/tugas1-law-db"
E   '

我目前正在使用 WSL Ubuntu,如果有帮助的话。我检查了 postgresql 服务是否正在运行,确实如此,我检查了凭据是否正确,并且我可以通过终端毫无问题地登录到 postgres,我检查了数据库“tugas1-law-db”是否存在。我还尝试将 SQLAlchemy URL 更改为在线数据库,但由于某种原因也失败了。我已经检查了 url 的语法是否正确,实际上当我在 Windows 设备中运行我的项目时,它运行没有问题。

python sqlalchemy fastapi windows-subsystem-for-linux
1个回答
0
投票

字符串上有额外的换行符,因为您有一个使用

"""
创建的多行字符串,并且最后还有一个额外的
"

>>> SQLALCHEMY_DATABASE_URL = f"""
postgresql://[my_username]:{os.environ["POSTGRES_PASSWORD"]}@localhost:5432/tugas1-law-db"
"""
>>> SQLALCHEMY_DATABASE_URL
'\npostgresql://[my_username]:[my_password]@localhost:5432/tugas1-law-db"\n'

通过使用单引号并将所有内容移动到同一行来删除换行符(以及额外的

"
):

SQLALCHEMY_DATABASE_URL = f"postgresql://[my_username]:{os.environ["POSTGRES_PASSWORD"]}@localhost:5432/tugas1-law-db"

或者只是从字符串中删除额外的

"
strip()
额外的换行符。

SQLALCHEMY_DATABASE_URL = f"""
postgresql://[my_username]:{os.environ["POSTGRES_PASSWORD"]}@localhost:5432/tugas1-law-db
"""
engine = create_engine(SQLALCHEMY_DATABASE_URL.strip())
© www.soinside.com 2019 - 2024. All rights reserved.