SQLAlchemy错误:无法从字符串解析SQLAlchemy URL
我无法通过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())