code: def upgrade():
      """Apply migration.
  
      If these columns are already of the right type (i.e. created by our
      migration in 1.10.13 rather than FAB itself in an earlier version), this
      migration will issue an alter statement to change them to what they already
      are -- i.e. its a no-op.
  
      These tables are small (100 to low 1k rows at most), so it's not too costly
      to change them.
      """
      conn = op.get_bind()
      if conn.dialect.name in ["mssql", "sqlite"]:
          # 1.10.12 didn't support SQL Server, so it couldn't have gotten this wrong --> nothing to correct
          # SQLite autoinc was "implicit" for an INTEGER NOT NULL PRIMARY KEY
          return
  
      for table in (
          "ab_permission",
          "ab_view_menu",
          "ab_role",
          "ab_permission_view",
          "ab_permission_view_role",
          "ab_user",
          "ab_user_role",
          "ab_register_user",
      ):
          with op.batch_alter_table(table) as batch:
              kwargs = {}
              if conn.dialect.name == "postgresql":
                  kwargs["server_default"] = sa.Sequence(
                      f"{table}_id_seq"
                  ).next_value()
              else:
                  kwargs["autoincrement"] = True
              batch.alter_column(
                  "id",
                  existing_type=sa.Integer(),
                  existing_nullable=False,
                  **kwargs,
              )
  
imports: from __future__ import annotations
  import sqlalchemy
  from alembic import op
label_desc: Use image node_id 1 for calling a global function with example usage: upgrade() without return types