Estou construindo um aplicativo fastapi + sqlalchemy
Meu código
sql.py
form sqlalchemy import Table, String, BigInteger, MetaData
metadata = MetaData()
custom_datasets = Table(
"custom_datasets",
metadata,
Column("project_id", String(500), primary_key=True),
Column("id", BigInteger, primary_key=True),
Column("name", String(500), unique=True),
Column("path", String(500), unique=True),
Column("feature_service", String(500), nullable=False),
Column("last_updated_timestamp", BigInteger, nullable=False),
)
principal.py
import os
from sqlalchemy.orm import Session
from sqlalchemy import select
def get_db():
if os.getenv("REGISTRY_CONNECTION_STRING"):
db = SessionLocal()
yield db
yield None
@app.get("/datasets/")
def get_project_registry(body: Dict[str, Any], db: Session = Depends(get_db)):
print("XXX_ ", custom_datasets.c) # XXX_ ImmutableColumnCollection(custom_datasets.project_id, custom_datasets.id,
stmt = select(custom_datasets).where(
custom_datasets.c.project_id in body.project_ids
)
res = db.execute().all()
return res
Eu tenho um erro
python3.8/site-packages/feast/feature_server.py", line 469, in get_project_registry
custom_datasets.c.project_id in body.project_ids
AttributeError: 'dict' object has no attribute 'project_ids'
Como corrigir o erro?
Atualizar:
A filtragem não está funcionando para a solicitação
GET http://127.0.0.1:8009/datasets
{
"project_ids": ["proj_id1"]
}
A tabela se parece com isso:
testdb=# SELECT * FROM custom_datasets;
project_id | id | name | path | feature_service | last_updated_timestamp
------------+----+-------+-----------+-----------------+------------------------
proj_id1 | 1 | name1 | path/path | service_name | 1
Código atualizado
@app.get("/datasets/")
def get_project_registry(body: Dict[str, Any], db: Session = Depends(get_db)):
print("XXX_ ", body['project_ids']) # prints XXX_ ['proj_id1']
stmt = select(custom_datasets).where(
custom_datasets.c.project_id in body['project_ids']
)
#stmt = select(custom_datasets)
res = db.execute(stmt).all()
return res
Em Python, se você quiser acessar um valor em um dicionário, você precisa fazer isso usando a notação de colchetes:
Quando você usa a notação de ponto, o Python não olha as chaves no dicionário, mas sim as propriedades do objeto do dicionário.
A
where ... in
filtragem não funciona porque você não pode usarin
diretamente assim em umaselect
declaração SQLAlchemy. O SQLAlchemy fornece um.in_
método para esse propósito: