Enforce SQLAlchemy-only database connections and Alembic-only schema changes
I maintainer di solito rispondono entro 3 giorni
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
Direzione di ricerca
Start with the existing rules registry and pytest guards, then inspect policyengine_api/data/v2/catalog/publication_staging.py to understand the two stated exceptions. Add a guard covering the specified code paths, proof fixtures, CI wiring in the existing test job, and guidance in docs/engineering/skills/alembic-migrations.md. Done means the guard rejects direct relational driver use and non-Alembic persistent schema changes, accepts only the exact exceptions, and its tests run in CI. Pull request #3979 is already open.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Problem
The Public API opens every relational database connection through SQLAlchemy today: API v1 builds its Cloud SQL engine in policyengine_api/data/orm.py (the Cloud SQL connector is passed to create_engine as creator=), and API v2 builds its SQLModel engine from a postgresql+psycopg URL in policyengine_api/data/v2/database.py. Schema changes go through the autogenerated Alembic revisions under migrations/v1 and migrations/v2.
Nothing enforces either of these. The rules registry has related rules, but none of them forbids:
- a direct driver connection such as
psycopg.connect(...),pymysql.connect(...)orsqlite3.connect(...), or use of the driver connection beneath SQLAlchemy, in application code, scripts or CI code.api.data.runtime-sql-confinedonly confines raw SQL to the data-access layer, andapi.services.no-direct-queriesonly covers services; - a schema change outside Alembic, such as
metadata.create_all(engine),Table.create(...),op.*outsidemigrations/, orCREATE/ALTER/DROP/TRUNCATESQL text.api.migration.alembic-autogenerated-onlyis doc-only, andapi.migration.alembic-v1-qualified/api.migration.alembic-v2-qualifiedcheck the revisions, not the code around them.
Both have happened before: the Stage 12 provisioning script (removed in d8bd72191) opened psycopg connections directly, and the local database bootstrap added in 6c7804100 called V1Base.metadata.create_all at runtime.
Proposed rule
Register an enforced rule, api.data.sqlalchemy-and-alembic-only: code connects to relational databases only through SQLAlchemy engines, connections and sessions, never by calling a database driver directly, and changes persistent schema only through Alembic revisions.
- Enforce it with a pytest guard that parses non-test code (
policyengine_api/,scripts/,migrations/,.github/, excluding tests and the generated revisions undermigrations/*/versions/). - Declare the two current exceptions exactly, both in
policyengine_api/data/v2/catalog/publication_staging.py:COPY ... FROM STDINthrough the psycopg connection beneath a SQLAlchemyConnection, because SQLAlchemy has no COPY API;STAGING_METADATA.create_allforTEMPORARYtables that Postgres drops at commit, which are not persistent schema.
- The guard should fail if either exception grows or is no longer needed.
- Redis (
policyengine_api/runtime_cache/) is a key-value cache, not a relational database, and is out of scope. - Add proof fixtures, CI wiring through the existing
testjob, and a section indocs/engineering/skills/alembic-migrations.md.
- Lingua principale
- Python
- Stelle
- 18
- Fork
- 33
- Merge medio
- 2g 18h
- PR unite (30g)
- 36
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di PolicyEngine/policyengine-api
-
Difficoltà 1/5 1-3 ore Idoneità per principianti 88/100
PolicyEngine/policyengine-api#3911 ·
I maintainer di solito rispondono entro 3 giorni
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 82/100
PolicyEngine/policyengine-api#3910 ·
I maintainer di solito rispondono entro 3 giorni
-
Stop serving economy results cached with ×100 decile relative changesForse già presa @anth-volk l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 45/100
PolicyEngine/policyengine-api#4025 ·
I maintainer di solito rispondono entro 3 giorni
-
Store the metadata v3 reads in the v2 catalog, from PolicyEngine.py's public recordsForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
PolicyEngine/policyengine-api#4022 ·
I maintainer di solito rispondono entro 3 giorni
-
Request UK constituency and local-authority impacts separately from the national economy resultForse già presa @anth-volk l’ha presa oggi. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
PolicyEngine/policyengine-api#4021 ·
I maintainer di solito rispondono entro 3 giorni
Tutte le issue di PolicyEngine/policyengine-api
Issue simili
-
Python Volcengine provider returns failures instead of raising themForse già presa @Ricardo-M-L l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 79/100
agent-infra/sandbox#248 ·
-
Textractor leaves empty temporary files when remote retrieval failsForse già presa @HuaTNA l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
test(bm_generation): pin the learning parameters and CPU sync shortcutForse già presa @iloveeyjafjalla l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
qboson/kaiwu-pytorch-plugin#1341 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
elder-plinius/V3R1T4S#625 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
foxglove/mcap#1907 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno