add drugs db index

This commit is contained in:
ipu 2025-08-07 20:38:50 +03:00
parent 126dcf78c7
commit ba9e90cd60
7 changed files with 78 additions and 12 deletions

View file

@ -0,0 +1,36 @@
"""add drug index
Revision ID: 058739dc7aa6
Revises: c509dcf806d4
Create Date: 2025-08-07 20:30:35.962671
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '058739dc7aa6'
down_revision: Union[str, Sequence[str], None] = 'c509dcf806d4'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('drugs', schema=None) as batch_op:
batch_op.create_index('ix_drugs_name_dosage_dosage_unit', ['name', 'dosage', 'dosage_unit'], unique=True)
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('drugs', schema=None) as batch_op:
batch_op.drop_index('ix_drugs_name_dosage_dosage_unit')
# ### end Alembic commands ###

View file

@ -22,6 +22,7 @@ dependencies = [
"asyncpg>=0.30.0", "asyncpg>=0.30.0",
"alembic>=1.16.4", "alembic>=1.16.4",
"psycopg2-binary>=2.9.10", "psycopg2-binary>=2.9.10",
"tqdm>=4.67.1",
] ]
[project.optional-dependencies] [project.optional-dependencies]

View file

@ -6,6 +6,7 @@ from src.database import Drug, Session
from src.drug_price_parser import DrugPriceParser, DrugPriceResponse from src.drug_price_parser import DrugPriceParser, DrugPriceResponse
from src.config import settings from src.config import settings
from src.services.session_service import session_service from src.services.session_service import session_service
from sqlalchemy.exc import IntegrityError
class DrugFull(BaseModel): class DrugFull(BaseModel):
@ -36,17 +37,17 @@ async def convert_drug_result(drug: DrugPriceResponse) -> list[DrugFull]:
return [DrugFull.model_validate(r) for r in response_dict["result"]] return [DrugFull.model_validate(r) for r in response_dict["result"]]
async def get_drug(drug_name: str) -> list[Drug]: async def get_drug(drug_name: str) -> list[DrugFull]:
parser = DrugPriceParser() parser = DrugPriceParser()
result = parser.get_drug_prices(drug_name) result = parser.get_drug_prices(drug_name)
drugs = await convert_drug_result(result) drugs = await convert_drug_result(result)
return drugs return drugs
async def store_drug(drugs: list[DrugFull]): async def store_drug(drugs: list[DrugFull]):
with Session() as session: with Session() as session:
for drug in drugs: for drug in drugs:
try:
session.add(Drug( session.add(Drug(
name=drug.name, name=drug.name,
dosage=drug.dosage, dosage=drug.dosage,
@ -55,6 +56,9 @@ async def store_drug(drugs: list[DrugFull]):
description=drug.description description=drug.description
)) ))
session.commit() session.commit()
except IntegrityError as e:
session.rollback()
pass
async def fetch_drug_with_dosage(drug_name: str, dosage: float) -> DrugFull | None: async def fetch_drug_with_dosage(drug_name: str, dosage: float) -> DrugFull | None:

View file

@ -29,6 +29,8 @@ class Settings(BaseSettings):
POSTGRES_HOST: str = "db" POSTGRES_HOST: str = "db"
POSTGRES_PORT: int = 5432 POSTGRES_PORT: int = 5432
DEBUG: bool = False
@property @property
def DATABASE_URL(self): # noqa def DATABASE_URL(self): # noqa

View file

@ -1,4 +1,4 @@
from sqlalchemy import BigInteger, Column, MetaData, String, Float, Text from sqlalchemy import BigInteger, Column, MetaData, String, Float, Text, Index
from sqlalchemy.orm import DeclarativeBase from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine from sqlalchemy import create_engine
@ -17,5 +17,14 @@ class Drug(Base):
unit_price = Column(Float, nullable=False) unit_price = Column(Float, nullable=False)
description = Column(Text, nullable=True) description = Column(Text, nullable=True)
Index(
"ix_drugs_name_dosage_dosage_unit",
Drug.name,
Drug.dosage,
Drug.dosage_unit,
unique=True
)
engine = create_engine(settings.DATABASE_URL) engine = create_engine(settings.DATABASE_URL)
Session = sessionmaker(autocommit=False, autoflush=False, bind=engine) Session = sessionmaker(autocommit=False, autoflush=False, bind=engine)

View file

@ -61,7 +61,7 @@ class SessionService:
agent_id = self.agent_id or settings.TALESTORM_AGENT_ID agent_id = self.agent_id or settings.TALESTORM_AGENT_ID
response = await client.post("/sessions/", params={"agent_id": agent_id}) response = await client.post("/sessions/", params={"agent_id": agent_id})
print(response.request.url) # print(response.request.url)
session_data = response.json() session_data = response.json()
return str(session_data["id"]) return str(session_data["id"])

14
uv.lock generated
View file

@ -426,6 +426,7 @@ dependencies = [
{ name = "redis" }, { name = "redis" },
{ name = "requests" }, { name = "requests" },
{ name = "sqlalchemy", extra = ["asyncio"] }, { name = "sqlalchemy", extra = ["asyncio"] },
{ name = "tqdm" },
] ]
[package.optional-dependencies] [package.optional-dependencies]
@ -461,6 +462,7 @@ requires-dist = [
{ name = "redis", specifier = ">=6.2.0" }, { name = "redis", specifier = ">=6.2.0" },
{ name = "requests", specifier = ">=2.31.0" }, { name = "requests", specifier = ">=2.31.0" },
{ name = "sqlalchemy", extras = ["asyncio"], specifier = ">=2.0.42" }, { name = "sqlalchemy", extras = ["asyncio"], specifier = ">=2.0.42" },
{ name = "tqdm", specifier = ">=4.67.1" },
] ]
provides-extras = ["dev"] provides-extras = ["dev"]
@ -1178,6 +1180,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/f7/1f/b876b1f83aef204198a42dc101613fefccb32258e5428b5f9259677864b4/starlette-0.47.2-py3-none-any.whl", hash = "sha256:c5847e96134e5c5371ee9fac6fdf1a67336d5815e09eb2a01fdb57a351ef915b", size = 72984, upload-time = "2025-07-20T17:31:56.738Z" }, { url = "https://files.pythonhosted.org/packages/f7/1f/b876b1f83aef204198a42dc101613fefccb32258e5428b5f9259677864b4/starlette-0.47.2-py3-none-any.whl", hash = "sha256:c5847e96134e5c5371ee9fac6fdf1a67336d5815e09eb2a01fdb57a351ef915b", size = 72984, upload-time = "2025-07-20T17:31:56.738Z" },
] ]
[[package]]
name = "tqdm"
version = "4.67.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" },
]
[[package]] [[package]]
name = "typer" name = "typer"
version = "0.16.0" version = "0.16.0"