From ac82d5854e48c82b16661263c2caf990d5b162fa Mon Sep 17 00:00:00 2001 From: Giorgio Gilestro Date: Wed, 27 May 2026 12:03:17 +0200 Subject: [PATCH] alembic: add 0021 csv_format_templates Co-Authored-By: Claude Opus 4.7 --- alembic/versions/0021_csv_format_template.py | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 alembic/versions/0021_csv_format_template.py diff --git a/alembic/versions/0021_csv_format_template.py b/alembic/versions/0021_csv_format_template.py new file mode 100644 index 0000000..6982277 --- /dev/null +++ b/alembic/versions/0021_csv_format_template.py @@ -0,0 +1,40 @@ +"""csv format templates table — LLM-fallback parser cache. + +Revision ID: 0021 +Revises: 0020 +Create Date: 2026-05-27 +""" +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + + +revision: str = "0021" +down_revision: Union[str, None] = "0020" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.create_table( + "csv_format_templates", + sa.Column("id", sa.BigInteger(), primary_key=True, autoincrement=True), + sa.Column("fingerprint", sa.String(length=64), nullable=False), + sa.Column("headers", sa.JSON(), nullable=False), + sa.Column("sample_row", sa.JSON(), nullable=False), + sa.Column("mapping", sa.JSON(), nullable=False), + sa.Column("preamble_rows", sa.Integer(), nullable=False, server_default="0"), + sa.Column("delimiter", sa.String(length=1), nullable=False, server_default=","), + sa.Column("broker_label", sa.String(length=128), nullable=True), + sa.Column("first_seen_at", sa.DateTime(timezone=True), nullable=False), + sa.Column("use_count", sa.Integer(), nullable=False, server_default="1"), + sa.Column("last_used_at", sa.DateTime(timezone=True), nullable=False), + sa.Column("llm_model", sa.String(length=64), nullable=True), + sa.Column("llm_cost_usd", sa.Float(), nullable=True), + sa.UniqueConstraint("fingerprint", name="uq_csv_format_templates_fingerprint"), + ) + + +def downgrade() -> None: + op.drop_table("csv_format_templates")