Changeset 190:5eea812dbbe7

Show
Ignore:
Timestamp:
07/19/09 21:08:44 (8 months ago)
Author:
rgrp
Branch:
default
convert_revision:
svn:0ead1229-0713-0410-96cd-f668dbfad531/trunk@276
Message:

[model][m]: Use sqlalchemy-migrate to handle db/model upgrade (ticket:53).

  • Integrate into cli with an upgrade command in shakespeare-admin
  • Ensure that creating with latest model data will set migrate_version correctly
    • Ensure clean removes migrate tables
  • Current model has been copied over to be first migrate script (001_pre_migrate_model.py)
Files:
6 added
3 modified

Legend:

Unmodified
Added
Removed
  • setup.py

    r187 r190  
    2323        'pygooglechart>=0.2,<0.3', 
    2424        'FormAlchemy>=1.0', 
     25        # last version to work with SQLA < 0.5 
     26        'SQLAlchemy-migrate==0.4.5', 
    2527        # 'annotater>=0.1', 
    2628        ], 
  • shakespeare/cli.py

    r189 r190  
    7878    # Commands 
    7979 
    80     db_actions = [ 'clean', 'create', 'rebuild', 'init_shksprdata', 'init_miltondata' ] 
     80    db_actions = [ 'create', 'upgrade', 'clean', 'rebuild', 'init_shksprdata', 'init_miltondata' ] 
    8181    def do_db(self, line=None): 
    8282        if line is None or line not in self.db_actions: 
     
    8686        import shakespeare.model as model 
    8787        import shakespeare 
    88         if line == 'clean': 
     88        migrate_repository = 'shakespeare/migration/' 
     89        if line == 'create': 
     90            model.repo.create_db() 
     91        elif line == 'clean': 
    8992            model.repo.clean_db() 
    90         elif line == 'create': 
    91             model.repo.create_db() 
    9293        elif line == 'rebuild': 
    9394            model.repo.rebuild_db() 
     95        elif line == 'upgrade': 
     96            import migrate.versioning.api 
     97            import migrate.versioning.api as mig 
     98            mig.upgrade(model.meta.engine.url, migrate_repository, 
     99                    version=None) 
     100        elif line == 'downgrade': 
     101            # TODO (need a version argument ...) 
     102            raise NotImplementedError() 
    94103        elif line.startswith('init_'): 
    95104            modname = line.strip()[5:] 
     
    102111        usage = \ 
    103112'''db { %s } 
     113 
    104114''' % ' | '.join(self.db_actions) 
     115        usage += '   upgrade: upgrade db to latest version using sqlalchemy migrate' 
    105116        print usage 
    106117     
  • shakespeare/model/__init__.py

    r189 r190  
    11'''The application's domain model objects''' 
     2import logging 
    23import sqlalchemy 
    34from sqlalchemy import orm 
     
    56import meta 
    67from dm import * 
     8 
     9log = logging.getLogger(__name__) 
    710 
    811def init_model(engine): 
     
    2023    def create_db(self): 
    2124        self.metadata.create_all(bind=self.metadata.bind) 
     25        # sqlalchemy migrate hack 
     26        from migrate.versioning.api import version_control, version  
     27        import shakespeare.migration.versions 
     28        v = version(shakespeare.migration.__path__[0]) 
     29        log.info( "Setting current version to '%s'" % v ) 
     30        version_control(self.metadata.bind.url, shakespeare.migration.__path__[0], v)  
    2231 
    2332    def clean_db(self): 
    2433        self.metadata.drop_all(bind=self.metadata.bind) 
     34        # remove migrate stuff if it exists 
     35        import sqlalchemy.exceptions 
     36        try: 
     37            version_table = Table('migrate_version', self.metadata, autoload=True)  
     38            version_table.drop() 
     39        except sqlalchemy.exceptions.NoSuchTableError: 
     40            pass 
    2541 
    2642    def rebuild_db(self):