From e563693f40b27c4c9ecbe0f2b96a78d7cf9e1a70 Mon Sep 17 00:00:00 2001 From: Nguyen Ngo Date: Sun, 17 May 2026 18:33:01 -0400 Subject: [PATCH] 05/17 fix migration script --- app/models/recovery_challenge.py | 2 ++ .../versions/e5f6a7b8c9d0_add_recovery_challenges_table.py | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/models/recovery_challenge.py b/app/models/recovery_challenge.py index 9fb4f86..4b0ee14 100644 --- a/app/models/recovery_challenge.py +++ b/app/models/recovery_challenge.py @@ -33,6 +33,8 @@ class RecoveryChallenge(db.Model): __tablename__ = 'recovery_challenges' id = db.Column(INTEGER(unsigned=True), autoincrement=True, primary_key=True) + # user_id must be UNSIGNED to match users.id (UNSIGNED primary key). + # MySQL 8 enforces strict type compatibility on foreign key column pairs. user_id = db.Column( INTEGER(unsigned=True), db.ForeignKey('users.id', ondelete='CASCADE'), diff --git a/migrations/versions/e5f6a7b8c9d0_add_recovery_challenges_table.py b/migrations/versions/e5f6a7b8c9d0_add_recovery_challenges_table.py index 89ce055..44084a9 100644 --- a/migrations/versions/e5f6a7b8c9d0_add_recovery_challenges_table.py +++ b/migrations/versions/e5f6a7b8c9d0_add_recovery_challenges_table.py @@ -30,7 +30,9 @@ def upgrade(): op.create_table( 'recovery_challenges', sa.Column('id', sa.Integer(), nullable=False, autoincrement=True), - sa.Column('user_id', sa.Integer(), nullable=False), + # user_id must be INTEGER UNSIGNED to match users.id (UNSIGNED primary key). + # MySQL 8 enforces strict type compatibility for foreign keys. + sa.Column('user_id', sa.Integer(unsigned=True), nullable=False), sa.Column('nonce', sa.String(64), nullable=False), sa.Column('expected_proof', sa.String(64), nullable=False), sa.Column('expires_at', sa.DateTime(), nullable=False),