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

1 投票
2 回答
208 浏览
提问于 2025-04-14 18:07

我无法通过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网址改成一个在线数据库,但出于某种原因也失败了。我检查过网址的格式是正确的,实际上当我在Windows设备上运行我的项目时没有任何问题。

2 个回答

1

除了字符串格式化,你还可以使用 URL.create() 来构建你的连接网址:

from sqlalchemy import create_engine, URL

SQLALCHEMY_DATABASE_URL = URL.create(
    "postgresql",
    username="my_username",
    password=os.environ["POSTGRES_PASSWORD"],
    host="localhost",
    port=5432,
    database="tugas1-law-db",
)
engine = create_engine(SQLALCHEMY_DATABASE_URL)
1

你的字符串中有多余的换行符,因为你使用了三重引号 """ 创建了一个多行字符串,并且最后还有一个多余的 "

>>> SQLALCHEMY_DATABASE_URL = f"""
postgresql://[my_username]:[my_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())

撰写回答