Необработанный SQL с помощью FastApi и SQLAlchemy (получить все столбцы)

#sqlalchemy #fastapi #feature-engineering

Вопрос:

У меня есть простая конечная точка FastApi, которая подключается к базе данных MySQL с помощью SQLAlchemy (на основе руководства: https://fastapi.tiangolo.com/tutorial/sql-databases/)

Я создаю сеанс, используя:

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

Я создаю зависимость:

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

В моем маршруте я хочу выполнить произвольную инструкцию SQL, но я не уверен, как правильно обрабатывать сеанс, соединение, курсор и т. Д. (Включая закрытие), Что, как я понял на собственном опыте, очень важно для правильной производительности

 @app.get("/get_data")
def get_data(db: Session = Depends(get_db)):
    ???
 

В конечном счете причина этого заключается в том, что моя таблица содержит функции машинного обучения со столбцами, которые заранее не определены. Если есть способ определить базовую модель со «всеми столбцами», это тоже сработало бы, но я тоже не смог ее найти.

Ответ №1:

Я решил эту проблему, используя https://www.encode.io/databases вместо этого/ пакет. Он обрабатывает все соединения / сеансы и т. Д. Под капотом. Упрощенный фрагмент:

 database = databases.Database(DATABASE_URL)
    
@app.get("/read_db")
async def read_db():
    data = await database.fetch_all("SELECT * FROM USER_TABLE")
    return data
 

Ответ №2:

 import pymysql, pandas as pd


engine = create_engine('mysql pymysql://' uname ':' password '@' server ':' port '/' db) 
con = engine.connect()
df = pd.read_sql('SELECT schema_name FROM information_schema.schemata', con)
return df