How to use SQLAlchemy's reflection to load data from a database table?

Viewed 263

I’m trying to use the reflection feature in SQLAlchemy to interact with an already existing database which contains data.

My work so far:

import os
import fastapi
import databases
import sqlalchemy
from typing import List
from pydantic import BaseModel
from dotenv import load_dotenv

load_dotenv()

DATABASE_URL = os.getenv('STAGING_SQLALCHEMY_DATABASE_URL')
database = databases.Database(DATABASE_URL)

engine = sqlalchemy.create_engine(DATABASE_URL)

metadata = sqlalchemy.MetaData()
metadata.reflect(bind=engine)
metadata.create_all(engine)

us_states = metadata.tables['us_states']


class USStates(BaseModel):
    name: str
    code: str


router = fastapi.APIRouter()


@router.get("/us_states/", response_model=List[USStates])
async def read_us_states():
    query = us_states.select()
    return await database.execute(query)

For some reason though, get_us_states() returns Null, even though the table currently has data.

How can I fix this?

1 Answers

So it turns out the issue was with STAGING_SQLALCHEMY_DATABASE_URL.

I had misspelled the name of my database, and for some reason, it wasn't throwing an error even though I had a try & catch in place for it in my main.py.

FYI, the format of your DB_URL when dealing with postgres should be:

postgresql://user:password@host/dbname
Related