fix(api): add fresh-DB guards to migrations 002, 005, and 006
- 002: wrap add_column calls in has_table("users") guard
- 005: add has_table + column-existence guard before add_column
- 006: add has_table + column + default-existence guard before alter_column
Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
@@ -25,16 +25,14 @@ def upgrade() -> None:
|
|||||||
inspector = sa.inspect(conn)
|
inspector = sa.inspect(conn)
|
||||||
|
|
||||||
# --- Extend users table for Better-Auth compatibility ---
|
# --- Extend users table for Better-Auth compatibility ---
|
||||||
existing_user_cols = (
|
# Guard: on a fresh DB Base.metadata.create_all (called in env.py after migrations)
|
||||||
[c["name"] for c in inspector.get_columns("users")]
|
# creates the users table with all columns, so migration 002 must not re-run add_column.
|
||||||
if inspector.has_table("users")
|
if inspector.has_table("users"):
|
||||||
else []
|
existing_user_cols = [c["name"] for c in inspector.get_columns("users")]
|
||||||
)
|
if "email_verified" not in existing_user_cols:
|
||||||
|
op.add_column("users", sa.Column("email_verified", sa.Boolean(), nullable=False, server_default="false"))
|
||||||
if "email_verified" not in existing_user_cols:
|
if "image" not in existing_user_cols:
|
||||||
op.add_column("users", sa.Column("email_verified", sa.Boolean(), nullable=False, server_default="false"))
|
op.add_column("users", sa.Column("image", sa.Text(), nullable=True))
|
||||||
if "image" not in existing_user_cols:
|
|
||||||
op.add_column("users", sa.Column("image", sa.Text(), nullable=True))
|
|
||||||
|
|
||||||
# --- Create sessions table ---
|
# --- Create sessions table ---
|
||||||
if not inspector.has_table("sessions"):
|
if not inspector.has_table("sessions"):
|
||||||
|
|||||||
@@ -18,6 +18,15 @@ depends_on = None
|
|||||||
|
|
||||||
|
|
||||||
def upgrade() -> None:
|
def upgrade() -> None:
|
||||||
|
conn = op.get_bind()
|
||||||
|
inspector = sa.inspect(conn)
|
||||||
|
# Guard: on a fresh DB Base.metadata.create_all creates users table with the column already present
|
||||||
|
if not inspector.has_table("users"):
|
||||||
|
return
|
||||||
|
existing_cols = [c["name"] for c in inspector.get_columns("users")]
|
||||||
|
if "email_inbound_token" in existing_cols:
|
||||||
|
return
|
||||||
|
|
||||||
# Add column nullable first so existing rows can be backfilled
|
# Add column nullable first so existing rows can be backfilled
|
||||||
op.add_column(
|
op.add_column(
|
||||||
"users",
|
"users",
|
||||||
@@ -25,11 +34,10 @@ def upgrade() -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Backfill existing users with unique tokens
|
# Backfill existing users with unique tokens
|
||||||
connection = op.get_bind()
|
result = conn.execute(sa.text("SELECT id FROM users WHERE email_inbound_token IS NULL"))
|
||||||
result = connection.execute(sa.text("SELECT id FROM users WHERE email_inbound_token IS NULL"))
|
|
||||||
for (user_id,) in result:
|
for (user_id,) in result:
|
||||||
token = secrets.token_urlsafe(16)
|
token = secrets.token_urlsafe(16)
|
||||||
connection.execute(
|
conn.execute(
|
||||||
sa.text("UPDATE users SET email_inbound_token = :token WHERE id = :id"),
|
sa.text("UPDATE users SET email_inbound_token = :token WHERE id = :id"),
|
||||||
{"token": token, "id": user_id},
|
{"token": token, "id": user_id},
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -15,6 +15,16 @@ depends_on = None
|
|||||||
|
|
||||||
|
|
||||||
def upgrade() -> None:
|
def upgrade() -> None:
|
||||||
|
conn = op.get_bind()
|
||||||
|
inspector = sa.inspect(conn)
|
||||||
|
# Guard: on a fresh DB Base.metadata.create_all already sets the server_default
|
||||||
|
if not inspector.has_table("users"):
|
||||||
|
return
|
||||||
|
cols = {c["name"]: c for c in inspector.get_columns("users")}
|
||||||
|
if "email_inbound_token" not in cols:
|
||||||
|
return
|
||||||
|
if cols["email_inbound_token"].get("default") is not None:
|
||||||
|
return
|
||||||
op.alter_column(
|
op.alter_column(
|
||||||
"users",
|
"users",
|
||||||
"email_inbound_token",
|
"email_inbound_token",
|
||||||
|
|||||||
Reference in New Issue
Block a user