Changeset 3667
- Timestamp:
- 08/27/06 14:40:49 (2 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/multiple-db-support/django/core/management.py
r3665 r3667 281 281 def syncdb(verbosity=2, interactive=True): 282 282 "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 284 285 from django.db.models import signals 285 from django.conf import settings286 286 from django.dispatch import dispatcher 287 287 288 288 disable_termcolors() 289 289 … … 291 291 _check_for_validation_errors() 292 292 293 # Import the 'management' module within each installed app, to register294 # dispatcher events.293 # Create missing models for each app 294 created_models = [] 295 295 for app_name in settings.INSTALLED_APPS: 296 # Import the 'management' module within each installed app, to register 297 # dispatcher events. 296 298 try: 297 299 __import__(app_name + '.management', '', '', ['']) … … 299 301 pass 300 302 301 data_types = get_creation_module().DATA_TYPES302 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 continue320 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] = refs328 sql.extend(_get_sql_for_pending_references(model, pending_references))329 if verbosity >= 2:330 print "Creating table %s" % model._meta.db_table331 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 346 303 # Send the post_syncdb signal, so individual apps can do whatever they need 347 304 # to do at this point. 348 305 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) 349 312 dispatcher.send(signal=signals.post_syncdb, sender=app, 350 313 app=app, created_models=created_models, 351 314 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(): 355 320 for model in models.get_models(app): 356 321 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() 369 332 370 333 syncdb.args = '' … … 423 386 def install(app): 424 387 "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 392 def _install(app, commit=True, initial_data=True): 425 393 from django.db import connection, models, transaction 426 394 import sys … … 433 401 _check_for_validation_errors(app) 434 402 403 created_models = [] 435 404 try: 436 405 pending = {} 437 406 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 442 417 if model in pending: 443 418 for statement in pending.pop(model): … … 445 420 if pending: 446 421 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) 449 425 if model in models_installed: 450 426 for statement in statements: … … 465 441 transaction.rollback_unless_managed() 466 442 sys.exit(1) 467 transaction.commit_unless_managed() 443 if commit: 444 transaction.commit_unless_managed() 445 return created_models 468 446 install.help_doc = "Executes ``sqlall`` for the given app(s) in the current database." 469 447 install.args = APP_ARGS django/branches/multiple-db-support/django/db/models/manager.py
r3448 r3667 131 131 run, pending = builder.get_create_table(self.model) 132 132 run += builder.get_create_indexes(self.model) 133 if initial_data:134 run += builder.get_initialdata(self.model)135 133 many_many = builder.get_create_many_to_many(self.model) 136 134 … … 143 141 else: 144 142 pending.setdefault(klass, []).extend(statements) 143 if initial_data: 144 self.load_initial_data() 145 145 return pending 146 146 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 147 156 def get_installed_models(self, table_list): 148 157 """Get list of models installed, given a list of tables.
