From 0c8fb413662cef0f91952aa98cd8c583f8aceb93 Mon Sep 17 00:00:00 2001 From: hyungi Date: Sat, 13 Jun 2026 06:49:58 +0900 Subject: [PATCH] =?UTF-8?q?fix(safety):=20backfill=20text()=20=EC=BD=9C?= =?UTF-8?q?=EB=A1=A0=20bind=20=EC=98=A4=EC=9D=B8=20=E2=80=94=20exec=5Fdriv?= =?UTF-8?q?er=5Fsql=20=EB=A1=9C=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 정규식 '(?:' 의 콜론을 text() 가 bind param 으로 해석 (migration 러너 동일 함정). Co-Authored-By: Claude Fable 5 --- scripts/backfill_material_axis.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/backfill_material_axis.py b/scripts/backfill_material_axis.py index a27fd80..4f5c8ce 100644 --- a/scripts/backfill_material_axis.py +++ b/scripts/backfill_material_axis.py @@ -36,7 +36,7 @@ import sys sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "app")) -from sqlalchemy import text +# text() 미사용 — exec_driver_sql (정규식 콜론 함정) from sqlalchemy.ext.asyncio import create_async_engine # ─── 술어별 (라벨, 카운트 SQL, 적용 SQL) ─────────────────────────────────────── @@ -191,12 +191,14 @@ async def main() -> None: trans = await conn.begin() try: for label, sql in STEPS: - result = await conn.execute(text(sql)) + # text() 는 정규식의 '(?:' 콜론을 bind param 으로 오인 (migration 러너와 + # 동일 함정) → driver 직결 실행 + result = await conn.exec_driver_sql(sql) print(f"[{tag}] {label}: {result.rowcount}행") print("\n─── 검증 (트랜잭션 내 미리보기) ───") for label, sql in VERIFY_SQL: - result = await conn.execute(text(sql)) + result = await conn.exec_driver_sql(sql) rows = result.fetchall() print(f"\n{label}:") for row in rows: