Fix PostgreSQL compatibility in Alembic migrations
This commit is contained in:
@@ -15,9 +15,27 @@ branch_labels = None
|
|||||||
depends_on = None
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def _has_column(table_name: str, column_name: str) -> bool:
|
||||||
|
bind = op.get_bind()
|
||||||
|
inspector = sa.inspect(bind)
|
||||||
|
return column_name in [c["name"] for c in inspector.get_columns(table_name)]
|
||||||
|
|
||||||
|
|
||||||
def upgrade():
|
def upgrade():
|
||||||
# engagement_mode column already exists from the earlier partial migration,
|
# On the original production database this column was added out-of-band,
|
||||||
# so do NOT add it again.
|
# outside of tracked migration history. On a fresh database (new env,
|
||||||
|
# new backend such as Postgres) it does not exist yet, so create it
|
||||||
|
# defensively here instead of assuming it's already present.
|
||||||
|
if not _has_column("clients", "engagement_mode"):
|
||||||
|
op.add_column(
|
||||||
|
"clients",
|
||||||
|
sa.Column(
|
||||||
|
"engagement_mode",
|
||||||
|
sa.String(length=30),
|
||||||
|
nullable=False,
|
||||||
|
server_default="internal_managed",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
# Make partner_id nullable in a SQLite-safe way
|
# Make partner_id nullable in a SQLite-safe way
|
||||||
with op.batch_alter_table("clients") as batch_op:
|
with op.batch_alter_table("clients") as batch_op:
|
||||||
@@ -31,7 +49,7 @@ def upgrade():
|
|||||||
with op.batch_alter_table("clients") as batch_op:
|
with op.batch_alter_table("clients") as batch_op:
|
||||||
batch_op.alter_column(
|
batch_op.alter_column(
|
||||||
"engagement_mode",
|
"engagement_mode",
|
||||||
existing_type=sa.String(length=32),
|
existing_type=sa.String(length=30),
|
||||||
server_default=None,
|
server_default=None,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -107,9 +107,9 @@ def upgrade() -> None:
|
|||||||
MIN(s.category) AS category,
|
MIN(s.category) AS category,
|
||||||
MIN(s.description) AS description,
|
MIN(s.description) AS description,
|
||||||
NULL AS recurrence_type,
|
NULL AS recurrence_type,
|
||||||
MAX(CASE WHEN s.is_active THEN 1 ELSE 0 END) AS is_active,
|
(MAX(CASE WHEN s.is_active THEN 1 ELSE 0 END) = 1) AS is_active,
|
||||||
MAX(CASE WHEN s.is_client_requestable THEN 1 ELSE 0 END) AS is_client_requestable,
|
(MAX(CASE WHEN s.is_client_requestable THEN 1 ELSE 0 END) = 1) AS is_client_requestable,
|
||||||
MAX(CASE WHEN s.is_consultant_requestable THEN 1 ELSE 0 END) AS is_consultant_requestable,
|
(MAX(CASE WHEN s.is_consultant_requestable THEN 1 ELSE 0 END) = 1) AS is_consultant_requestable,
|
||||||
MIN(s.created_by_user_id) AS created_by_user_id,
|
MIN(s.created_by_user_id) AS created_by_user_id,
|
||||||
MIN(s.updated_by_user_id) AS updated_by_user_id,
|
MIN(s.updated_by_user_id) AS updated_by_user_id,
|
||||||
MIN(s.created_at_utc) AS created_at_utc,
|
MIN(s.created_at_utc) AS created_at_utc,
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ def upgrade():
|
|||||||
SELECT
|
SELECT
|
||||||
s.tenant_id,
|
s.tenant_id,
|
||||||
sc.id,
|
sc.id,
|
||||||
MAX(CASE WHEN s.is_active THEN 1 ELSE 0 END) AS is_enabled,
|
(MAX(CASE WHEN s.is_active THEN 1 ELSE 0 END) = 1) AS is_enabled,
|
||||||
MIN(s.branch_id) AS default_branch_id,
|
MIN(s.branch_id) AS default_branch_id,
|
||||||
MIN(s.created_by_user_id) AS activated_by_user_id,
|
MIN(s.created_by_user_id) AS activated_by_user_id,
|
||||||
MIN(s.updated_by_user_id) AS updated_by_user_id,
|
MIN(s.updated_by_user_id) AS updated_by_user_id,
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ def upgrade() -> None:
|
|||||||
sa.Column("created_by_user_id", sa.Integer(), sa.ForeignKey("users.id"), nullable=True),
|
sa.Column("created_by_user_id", sa.Integer(), sa.ForeignKey("users.id"), nullable=True),
|
||||||
sa.Column("created_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")),
|
sa.Column("created_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")),
|
||||||
sa.Column("updated_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")),
|
sa.Column("updated_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")),
|
||||||
sa.Column("is_deleted", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("is_deleted", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
)
|
)
|
||||||
|
|
||||||
index_specs = [
|
index_specs = [
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ def upgrade() -> None:
|
|||||||
sa.Column("reviewed_at_utc", sa.DateTime(timezone=True), nullable=True),
|
sa.Column("reviewed_at_utc", sa.DateTime(timezone=True), nullable=True),
|
||||||
sa.Column("created_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")),
|
sa.Column("created_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")),
|
||||||
sa.Column("updated_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")),
|
sa.Column("updated_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")),
|
||||||
sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.text("1")),
|
sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.text("true")),
|
||||||
)
|
)
|
||||||
|
|
||||||
for index_name, columns in {
|
for index_name, columns in {
|
||||||
@@ -77,7 +77,7 @@ def upgrade() -> None:
|
|||||||
|
|
||||||
if _has_table(bind, "service_catalogues") and not _has_column(bind, "service_catalogues", "is_consultant_requestable"):
|
if _has_table(bind, "service_catalogues") and not _has_column(bind, "service_catalogues", "is_consultant_requestable"):
|
||||||
with op.batch_alter_table("service_catalogues") as batch_op:
|
with op.batch_alter_table("service_catalogues") as batch_op:
|
||||||
batch_op.add_column(sa.Column("is_consultant_requestable", sa.Boolean(), nullable=False, server_default=sa.text("0")))
|
batch_op.add_column(sa.Column("is_consultant_requestable", sa.Boolean(), nullable=False, server_default=sa.text("false")))
|
||||||
|
|
||||||
|
|
||||||
def downgrade() -> None:
|
def downgrade() -> None:
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ def upgrade() -> None:
|
|||||||
sa.Column("branch_id", sa.Integer(), nullable=True),
|
sa.Column("branch_id", sa.Integer(), nullable=True),
|
||||||
sa.Column("consultant_id", sa.Integer(), nullable=True),
|
sa.Column("consultant_id", sa.Integer(), nullable=True),
|
||||||
sa.Column("parent_tenant_id", sa.Integer(), nullable=True),
|
sa.Column("parent_tenant_id", sa.Integer(), nullable=True),
|
||||||
sa.Column("is_primary", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("is_primary", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("is_verified", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("is_verified", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("status", sa.String(length=30), nullable=False, server_default="draft"),
|
sa.Column("status", sa.String(length=30), nullable=False, server_default="draft"),
|
||||||
sa.Column("verification_token", sa.String(length=120), nullable=True),
|
sa.Column("verification_token", sa.String(length=120), nullable=True),
|
||||||
sa.Column("dns_txt_name", sa.String(length=255), nullable=True),
|
sa.Column("dns_txt_name", sa.String(length=255), nullable=True),
|
||||||
|
|||||||
@@ -199,19 +199,19 @@ def upgrade() -> None:
|
|||||||
sa.Column("onboarding_date", sa.Date(), nullable=True),
|
sa.Column("onboarding_date", sa.Date(), nullable=True),
|
||||||
sa.Column("closing_date", sa.Date(), nullable=True),
|
sa.Column("closing_date", sa.Date(), nullable=True),
|
||||||
sa.Column("notes", sa.Text(), nullable=True),
|
sa.Column("notes", sa.Text(), nullable=True),
|
||||||
sa.Column("gst_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("gst_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("income_tax_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("income_tax_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("tds_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("tds_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("roc_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("roc_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("audit_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("audit_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("pf_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("pf_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("esi_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("esi_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("professional_tax_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("professional_tax_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("payroll_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("payroll_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("msme_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("msme_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("import_export_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("import_export_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.text("1")),
|
sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.text("true")),
|
||||||
sa.Column("is_archived", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
sa.Column("is_archived", sa.Boolean(), nullable=False, server_default=sa.text("false")),
|
||||||
sa.Column("archived_at_utc", sa.DateTime(timezone=True), nullable=True),
|
sa.Column("archived_at_utc", sa.DateTime(timezone=True), nullable=True),
|
||||||
sa.Column("created_by_user_id", sa.Integer(), nullable=True),
|
sa.Column("created_by_user_id", sa.Integer(), nullable=True),
|
||||||
sa.Column("updated_by_user_id", sa.Integer(), nullable=True),
|
sa.Column("updated_by_user_id", sa.Integer(), nullable=True),
|
||||||
|
|||||||
Reference in New Issue
Block a user