How do you deal with creating new tables in this scenario? Right now I'm importing the model object and calling create() on the table like this:
from manager.models import Account def upgrade(migrate_engine): metadata.bind = migrate_engine Account.__table__.create() def downgrade(migrate_engine): metadata.bind = migrate_engine Account.__table__.drop() This avoids having to duplicate the table definition when using the declarative syntax, but I can imagine some edge conditions causing problems if Account is modified later on. On Jul 9, 11:03 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: > On Jul 10, 2010, at 1:08 AM, Steven Wei wrote: > > > > > On Jun 17, 4:00 am, Francisco Souza <franci...@franciscosouza.net> > > wrote: > >>> But do I do this? Part of the problem is that I don't know of a way > >>> to generate tables other than create_all() (or drop_all()) when using > >>> declarative syntax. Is there another way? > > >> Hi Shane :) > > >> When you bind your declarative base to a metadata, the "metadata" object > >> has > >> a attribute called "tables", wich is a dict with all tables containeds in > >> this metadata. So, you can do a create for a single table easily. > > >>>>> Base.metadata.tables['test_case'].create(engine) > > >> You can call it on your upgrade function inside the migration module. > > > Isn't this incredibly problematic if you need to change the model > > definition later? What if you need to add a column to this table in a > > new migration later on? > > > It will work on your existing databases, but if you run through your > > migrations on a fresh database, you'll have a problem because the > > first migration created the table with the extra column in place, and > > the second migration won't be able to add the column again. > > > The sqlalchemy-migrate docs suggest you copy and paste Table > > definitions to avoid this behavior (ugh). But when you're using > > DeclarativeBase you don't even have any Table definitions to copy > > from! > > the sqlalchemy-migrate docs are insane in this regard. Use reflected tables > in your migrations scripts, that way you don't have to worry at all about > what the status of the table is other than the thing you are migrating. > When I eventually get around to releasing Alembic, you won't even have to > reflect anything, you can just specify the alterations you care about. > > > > > Is there any way around this other than not running migrations when > > creating new databases (and instead sticking with create_all() > > directly)? > > i havent read the thread here, but if the issue is, how to create new > databases when you're up to version 67 in your migrations, issue the > create_all(), then create the migration table, then set the version to the > most recent. Code looks like this: > > from migrate.versioning.api import version_control, version, upgrade > from migrate.versioning.exceptions import DatabaseAlreadyControlledError > > Base.metadata.create_all(bind=engine, checkfirst=True) > > # setup migrate versioning table if not present > try: > latest_version = version("migrate") > version_control(url, "migrate", version=latest_version, echo=True) > except DatabaseAlreadyControlledError: > log.info("migrate table already present") > > # do any migrate upgrades pending... > upgrade(url, "migrate", version=latest_version, echo=True) > > my apologies if this is not the question being asked. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.