Django

Code

Changeset 3667

Show
Ignore:
Timestamp:
08/27/06 14:40:49 (2 years ago)
Author:
jpellerin
Message:

[multi-db] Implemented django.core.managment.syncdb using db access through managers. This required changing the progress messages from prospective ('Installing... ') to retrospective ('Installed ... ').

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/multiple-db-support/django/core/management.py

    r3665 r3667  
    281281def syncdb(verbosity=2, interactive=True): 
    282282    "Creates the database tables for all apps in INSTALLED_APPS whose tables haven't already been created." 
    283     from django.db import connection, transaction, models, get_creation_module 
     283    from django.conf import settings 
     284    from django.db import models, transaction 
    284285    from django.db.models import signals 
    285     from django.conf import settings 
    286286    from django.dispatch import dispatcher 
    287  
     287     
    288288    disable_termcolors() 
    289289 
     
    291291    _check_for_validation_errors() 
    292292 
    293     # Import the 'management' module within each installed app, to register 
    294     # dispatcher events. 
     293    # Create missing models for each app 
     294    created_models = [] 
    295295    for app_name in settings.INSTALLED_APPS: 
     296        # Import the 'management' module within each installed app, to register 
     297        # dispatcher events. 
    296298        try: 
    297299            __import__(app_name + '.management', '', '', ['']) 
     
    299301            pass 
    300302 
    301     data_types = get_creation_module().DATA_TYPES 
    302  
    303     cursor = connection.cursor() 
    304  
    305     # Get a list of all existing database tables, 
    306     # so we know what needs to be added. 
    307     table_list = _get_table_list() 
    308  
    309     # Get a list of already installed *models* so that references work right. 
    310     seen_models = _get_installed_models(table_list) 
    311     created_models = set() 
    312     pending_references = {} 
    313  
    314     for app in models.get_apps(): 
    315         model_list = models.get_models(app) 
    316         for model in model_list: 
    317             # Create the model's database table, if it doesn't already exist. 
    318             if model._meta.db_table in table_list: 
    319                 continue 
    320             sql, references = _get_sql_model_create(model, seen_models) 
    321             seen_models.add(model) 
    322             created_models.add(model) 
    323             for refto, refs in references.items(): 
    324                 try: 
    325                     pending_references[refto].extend(refs) 
    326                 except KeyError: 
    327                     pending_references[refto] = refs 
    328             sql.extend(_get_sql_for_pending_references(model, pending_references)) 
    329             if verbosity >= 2: 
    330                 print "Creating table %s" % model._meta.db_table 
    331             for statement in sql: 
    332                 cursor.execute(statement) 
    333             table_list.append(model._meta.db_table) 
    334  
    335         for model in model_list: 
    336             if model in created_models: 
    337                 sql = _get_many_to_many_sql_for_model(model) 
    338                 if sql: 
    339                     if verbosity >= 2: 
    340                         print "Creating many-to-many tables for %s model" % model.__name__ 
    341                     for statement in sql: 
    342                         cursor.execute(statement) 
    343  
    344         transaction.commit_unless_managed() 
    345  
    346303    # Send the post_syncdb signal, so individual apps can do whatever they need 
    347304    # to do at this point. 
    348305    for app in models.get_apps(): 
     306        # Install each application (models already installed will be skipped) 
     307        created = _install(app, commit=False, initial_data=False) 
     308        if verbosity >= 2: 
     309            for model in created: 
     310                print "Created table %s" % model._meta.db_table 
     311        created_models.extend(created) 
    349312        dispatcher.send(signal=signals.post_syncdb, sender=app, 
    350313            app=app, created_models=created_models,  
    351314            verbosity=verbosity, interactive=interactive) 
    352  
    353         # Install initial data for the app (but only if this is a model we've 
    354         # just created) 
     315    transaction.commit_unless_managed() 
     316 
     317    # Install initial data for the app (but only if this is a model we've 
     318    # just created) 
     319    for app in models.get_apps(): 
    355320        for model in models.get_models(app): 
    356321            if model in created_models: 
    357                 initial_sql = get_sql_initial_data_for_model(model) 
    358                 if initial_sql: 
    359                     print "Installing initial data for %s model" % model._meta.object_name 
    360                     try: 
    361                         for sql in initial_sql: 
    362                             cursor.execute(sql) 
    363                     except Exception, e: 
    364                         sys.stderr.write("Failed to install initial SQL data for %s model: %s" % \ 
    365                                             (model._meta.object_name, e)) 
    366                         transaction.rollback_unless_managed() 
    367                     else: 
    368                         transaction.commit_unless_managed() 
     322                try: 
     323                    if (model._default_manager.load_initial_data()  
     324                        and verbosity >= 2): 
     325                        print "Installed initial data for %s model" % model._meta.object_name 
     326                except Exception, e: 
     327                    sys.stderr.write("Failed to install initial SQL data for %s model: %s" % \ 
     328                                     (model._meta.object_name, e)) 
     329                    transaction.rollback_unless_managed() 
     330                else: 
     331                    transaction.commit_unless_managed() 
    369332 
    370333syncdb.args = '' 
     
    423386def install(app): 
    424387    "Executes the equivalent of 'get_sql_all' in the current database." 
     388    # Wrap _install to hide the return value so ./manage.py install 
     389    # doesn't complain about unprintable output.     
     390    _install(app) 
     391 
     392def _install(app, commit=True, initial_data=True): 
    425393    from django.db import connection, models, transaction 
    426394    import sys 
     
    433401    _check_for_validation_errors(app) 
    434402 
     403    created_models = [] 
    435404    try: 
    436405        pending = {} 
    437406        for model in models.get_models(app, creation_order=True): 
    438             new_pending = model._default_manager.install(initial_data=True) 
    439             for model, statements in new_pending.items(): 
    440                 pending.setdefault(model, []).extend(statements) 
    441             # execute any pending statements that were waiting for this model 
     407            manager = model._default_manager 
     408            tables = manager.get_table_list() 
     409            models_installed = manager.get_installed_models(tables) 
     410            # Don't re-install already-installed models 
     411            if not model in models_installed: 
     412                new_pending = manager.install(initial_data=initial_data) 
     413                created_models.append(model) 
     414                for model, statements in new_pending.items(): 
     415                    pending.setdefault(model, []).extend(statements) 
     416            # Execute any pending statements that were waiting for this model 
    442417            if model in pending: 
    443418                for statement in pending.pop(model): 
     
    445420        if pending:             
    446421            for model, statements in pending.items(): 
    447                 tables = model._default_manager.get_table_list() 
    448                 models_installed = model._default_manager.get_installed_models(tables) 
     422                manager = model._default_manager  
     423                tables = manager.get_table_list() 
     424                models_installed = manager.get_installed_models(tables) 
    449425                if model in models_installed: 
    450426                    for statement in statements: 
     
    465441        transaction.rollback_unless_managed() 
    466442        sys.exit(1) 
    467     transaction.commit_unless_managed() 
     443    if commit: 
     444        transaction.commit_unless_managed() 
     445    return created_models 
    468446install.help_doc = "Executes ``sqlall`` for the given app(s) in the current database." 
    469447install.args = APP_ARGS 
  • django/branches/multiple-db-support/django/db/models/manager.py

    r3448 r3667  
    131131        run, pending = builder.get_create_table(self.model) 
    132132        run += builder.get_create_indexes(self.model) 
    133         if initial_data: 
    134             run += builder.get_initialdata(self.model) 
    135133        many_many = builder.get_create_many_to_many(self.model) 
    136134 
     
    143141            else: 
    144142                pending.setdefault(klass, []).extend(statements) 
     143        if initial_data: 
     144            self.load_initial_data() 
    145145        return pending 
    146146 
     147    def load_initial_data(self): 
     148        """Install initial data for model in db, Returns statements executed. 
     149        """ 
     150        builder = self.db.get_creation_module().builder 
     151        statements = builder.get_initialdata(self.model) 
     152        for statement in statements: 
     153            statement.execute() 
     154        return statements 
     155         
    147156    def get_installed_models(self, table_list): 
    148157        """Get list of models installed, given a list of tables.