Importing migrate.changeset adds some new methods to existing SA objects, as well as creating functions of its own. Most operations can be done either by a method or a function. Methods match SQLAlchemy’s existing API and are more intuitive when the object is available; functions allow one to make changes when only the name of an object is available (for example, adding a column to a table in the database without having to load that table into Python).
Changeset operations can be used independently of SQLAlchemy Migrate’s versioning.
For more information, see the generated documentation for migrate.changeset.
Given a standard SQLAlchemy table:
table = Table('mytable',meta,
Column('id',Integer,primary_key=True),
)
table.create()
Create a column:
col = Column('col1',String)
col.create(table)
# Column is added to table based on its name
assert col is table.c.col1
Drop a column (Not supported by SQLite):
col.drop()
Alter a column (Not supported by SQLite):
col.alter(name='col2')
# Renaming a column affects how it's accessed by the table object
assert col is table.c.col2
# Other properties can be modified as well
col.alter(type=String(42),
default="life, the universe, and everything",
nullable=False,
)
# Given another column object, col1.alter(col2), col1 will be changed to match col2
col.alter(Column('col3',String(77),nullable=True))
assert col.nullable
assert table.c.col3 is col
SQLAlchemy supports index create/drop
Rename an index, given an SQLAlchemy Index object:
index.rename('newindexname')
SQLAlchemy supports creating/dropping constraints at the same time a table is created/dropped. SQLAlchemy Migrate adds support for creating/dropping primary/foreign key constraints independently.
Primary key constraints:
cons = PrimaryKeyConstraint(col1,col2)
# Create the constraint
cons.create()
# Drop the constraint
cons.drop()
Note that Oracle requires that you state the name of the primary key constraint to be created/dropped. SQLAlchemy Migrate will try to guess the name of the PK constraint for other databases, but if it’s something other than the default, you’ll need to give its name:
PrimaryKeyConstraint(col1,col2,name='my_pk_constraint')
Foreign key constraints:
cons = ForeignKeyConstraint([table.c.fkey], [othertable.c.id])
# Create the constraint
cons.create()
# Drop the constraint
cons.drop()
Names are specified just as with primary key constraints:
ForeignKeyConstraint([table.c.fkey], [othertable.c.id],name='my_fk_constraint')