code: def upgrade():
      with op.batch_alter_table("slices") as batch_op:
          batch_op.add_column(
              sa.Column("last_saved_at", sa.DateTime(), nullable=True)
          )
          batch_op.add_column(
              sa.Column("last_saved_by_fk", sa.Integer(), nullable=True)
          )
          batch_op.create_foreign_key(
              "slices_last_saved_by_fk",
              "ab_user",
              ["last_saved_by_fk"],
              ["id"],
          )
  
      # now do data migration, copy values from changed_on and changed_by
      slices_table = sa.Table(
          "slices",
          sa.MetaData(),
          sa.Column("changed_on", sa.DateTime(), nullable=True),
          sa.Column("changed_by_fk", sa.Integer(), nullable=True),
          sa.Column("last_saved_at", sa.DateTime(), nullable=True),
          sa.Column("last_saved_by_fk", sa.Integer(), nullable=True),
      )
      conn = op.get_bind()
      conn.execute(
          slices_table.update().values(
              last_saved_at=slices_table.c.changed_on,
              last_saved_by_fk=slices_table.c.changed_by_fk,
          )
      )
  
imports: 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