From 7057992136b143860ce95e3322458c4a63da037b Mon Sep 17 00:00:00 2001 From: xiaji Date: Sat, 13 Jun 2026 21:15:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(alembic=200007):=20=E6=94=B9=E7=94=A8=20sa.?= =?UTF-8?q?Column=20=E5=86=85=E5=B5=8C=20ForeignKey=20=E5=BD=A2=E5=BC=8F,?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E5=88=97=E6=95=B0=E4=B8=8D=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前用独立 sa.ForeignKeyConstraint 报 ArgumentError, 改用 sa.Column(..., sa.ForeignKey(...), ...) 形式( 跟 model 里的 mapped_column 形式对齐)。 --- .../alembic/versions/0007_article_reads.py | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/backend/alembic/versions/0007_article_reads.py b/backend/alembic/versions/0007_article_reads.py index 4909c03..a8e4fc0 100644 --- a/backend/alembic/versions/0007_article_reads.py +++ b/backend/alembic/versions/0007_article_reads.py @@ -1,8 +1,8 @@ """文章已读记录(per-user) -- article_reads.user_id BIGINT FK users.id ON DELETE CASCADE -- article_reads.article_id BIGINT FK articles.id ON DELETE CASCADE -- article_reads.read_at TIMESTAMPTZ DEFAULT now() +- article_reads.user_id INTEGER FK users.id ON DELETE CASCADE +- article_reads.article_id BIGINT FK articles.id ON DELETE CASCADE +- article_reads.read_at TIMESTAMPTZ DEFAULT now() - 复合主键 (user_id, article_id) — 天然幂等 Revision ID: 0007 @@ -25,16 +25,25 @@ depends_on = None def upgrade() -> None: op.create_table( "article_reads", - sa.Column("user_id", sa.Integer, nullable=False), # users.id 是 Integer - sa.Column("article_id", sa.BigInteger, nullable=False), # articles.id 是 BigInteger - sa.Column("read_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")), + sa.Column( + "user_id", + sa.Integer, + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), + sa.Column( + "article_id", + sa.BigInteger, + sa.ForeignKey("articles.id", ondelete="CASCADE"), + nullable=False, + ), + sa.Column( + "read_at", + sa.DateTime(timezone=True), + nullable=False, + server_default=sa.text("now()"), + ), sa.PrimaryKeyConstraint("user_id", "article_id", name="pk_article_reads"), - sa.ForeignKeyConstraint( - "user_id", ["users.id"], ondelete="CASCADE", - ), - sa.ForeignKeyConstraint( - "article_id", ["articles.id"], ondelete="CASCADE", - ), ) op.create_index( "ix_article_reads_user_read_at",