from pathlib import Path from sqlalchemy import create_engine, inspect, text from sqlalchemy.orm import DeclarativeBase, sessionmaker BASE_DIR = Path(__file__).resolve().parent.parent DATA_DIR = BASE_DIR / "data" DATA_DIR.mkdir(parents=True, exist_ok=True) DATABASE_URL = f"sqlite:///{DATA_DIR / 'app.db'}" class Base(DeclarativeBase): pass engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False}) SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False) def get_db(): db = SessionLocal() try: yield db finally: db.close() def ensure_property_schema() -> None: inspector = inspect(engine) if "properties" not in inspector.get_table_names(): return existing_columns = {column["name"] for column in inspector.get_columns("properties")} migrations = { "num_bloco": "ALTER TABLE properties ADD COLUMN num_bloco VARCHAR(30)", "num_inscricao": "ALTER TABLE properties ADD COLUMN num_inscricao VARCHAR(30)", "cod_endloc_logradouro": "ALTER TABLE properties ADD COLUMN cod_endloc_logradouro VARCHAR(30)", "nme_endloc_logradouro": "ALTER TABLE properties ADD COLUMN nme_endloc_logradouro VARCHAR(150)", "num_endloc_endereco": "ALTER TABLE properties ADD COLUMN num_endloc_endereco VARCHAR(30)", "num_endloc_unidade": "ALTER TABLE properties ADD COLUMN num_endloc_unidade VARCHAR(30)", "nme_endloc_bairro_cdl": "ALTER TABLE properties ADD COLUMN nme_endloc_bairro_cdl VARCHAR(120)", "rh_nome": "ALTER TABLE properties ADD COLUMN rh_nome VARCHAR(80)", "rh_valor": "ALTER TABLE properties ADD COLUMN rh_valor FLOAT", "coord_x": "ALTER TABLE properties ADD COLUMN coord_x FLOAT", "coord_y": "ALTER TABLE properties ADD COLUMN coord_y FLOAT", "ano_exercicio": "ALTER TABLE properties ADD COLUMN ano_exercicio FLOAT", "num_versao": "ALTER TABLE properties ADD COLUMN num_versao FLOAT", "idf_reg_regiao_homogenea": "ALTER TABLE properties ADD COLUMN idf_reg_regiao_homogenea FLOAT", "area_total_detalhe": "ALTER TABLE properties ADD COLUMN area_total_detalhe VARCHAR(1000)", "area_privativa_detalhe": "ALTER TABLE properties ADD COLUMN area_privativa_detalhe VARCHAR(1000)", "latitude": "ALTER TABLE properties ADD COLUMN latitude FLOAT", "longitude": "ALTER TABLE properties ADD COLUMN longitude FLOAT", "finalidade_oferta": "ALTER TABLE properties ADD COLUMN finalidade_oferta VARCHAR(50)", "area_total_oferta": "ALTER TABLE properties ADD COLUMN area_total_oferta FLOAT", "area_privativa_oferta": "ALTER TABLE properties ADD COLUMN area_privativa_oferta FLOAT", "valor_oferta": "ALTER TABLE properties ADD COLUMN valor_oferta FLOAT", "descricao_oferta": "ALTER TABLE properties ADD COLUMN descricao_oferta TEXT", "observacao": "ALTER TABLE properties ADD COLUMN observacao TEXT", "url": "ALTER TABLE properties ADD COLUMN url TEXT", "imobiliaria": "ALTER TABLE properties ADD COLUMN imobiliaria VARCHAR(150)", "codigo": "ALTER TABLE properties ADD COLUMN codigo VARCHAR(80)", "infra": "ALTER TABLE properties ADD COLUMN infra TEXT", "padrao": "ALTER TABLE properties ADD COLUMN padrao VARCHAR(80)", "conservacao": "ALTER TABLE properties ADD COLUMN conservacao VARCHAR(80)", "vaga": "ALTER TABLE properties ADD COLUMN vaga VARCHAR(80)", } with engine.begin() as connection: for column_name, statement in migrations.items(): if column_name not in existing_columns: connection.execute(text(statement))