Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Enforce SQLAlchemy-only database connections and Alembic-only schema changes

オープン
#3,978 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 3 日以内に返信

@anth-volk がすでに取り組んでいます。

2026年10月20日 から。

  • #3979 @anth-volk による — オープン

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
35/100
issue の種類
機能追加
明瞭さ
明確に書かれている
活発さ
停滞
技術スタック
github-actions, postgresql, python, sqlalchemy

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

説明

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(...) or sqlite3.connect(...), or use of the driver connection beneath SQLAlchemy, in application code, scripts or CI code. api.data.runtime-sql-confined only confines raw SQL to the data-access layer, and api.services.no-direct-queries only covers services;
  • a schema change outside Alembic, such as metadata.create_all(engine), Table.create(...), op.* outside migrations/, or CREATE / ALTER / DROP / TRUNCATE SQL text. api.migration.alembic-autogenerated-only is doc-only, and api.migration.alembic-v1-qualified / api.migration.alembic-v2-qualified check 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 under migrations/*/versions/).
  • Declare the two current exceptions exactly, both in policyengine_api/data/v2/catalog/publication_staging.py:
    • COPY ... FROM STDIN through the psycopg connection beneath a SQLAlchemy Connection, because SQLAlchemy has no COPY API;
    • STAGING_METADATA.create_all for TEMPORARY tables 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 test job, and a section in docs/engineering/skills/alembic-migrations.md.
主要言語
Python
スター
18
フォーク
33
平均マージ
2日 15時間
マージ済み PR(30日)
35

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

PolicyEngine/policyengine-api のほかの issue

PolicyEngine/policyengine-api の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。