mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[soc2009/multidb] Renaming of database attributes - you now use NAME, ENGINE, etc rather than DATABASE_NAME, DATABASE_ENGINE inside DATABASES. Also deprecates the use of short names (.e.g., `sqlite3` for backends in ENGINE).  Patch from Russell Keith-Magee.
				
					
				
			Conflicts: docs/releases/1.2.txt git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/multidb@11775 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		
							
								
								
									
										3
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								TODO
									
									
									
									
									
								
							| @@ -7,9 +7,6 @@ Required for v1.2 | ||||
|  * Finalize the sql.Query internals | ||||
|    * Clean up the use of db.backend.query_class() | ||||
|    * Verify it still works with GeoDjango | ||||
|  * Resolve the public facing UI issues around using multi-db | ||||
|    * Should we take the opportunity to modify DB backends to use fully qualified paths? | ||||
|    * Should we clean up DATABASES['DATABASE_NAME'] to DATABASES['NAME'] etc? | ||||
|  * Cleanup of new API entry points | ||||
|     * validate() on a field | ||||
|         * name/purpose clash with Honza? | ||||
|   | ||||
| @@ -11,16 +11,15 @@ MANAGERS = ADMINS | ||||
|  | ||||
| DATABASES = { | ||||
|     'default': { | ||||
|         'DATABASE_ENGINE': '',           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. | ||||
|         'DATABASE_NAME': '',             # Or path to database file if using sqlite3. | ||||
|         'DATABASE_USER': '',             # Not used with sqlite3. | ||||
|         'DATABASE_PASSWORD': '',         # Not used with sqlite3. | ||||
|         'DATABASE_HOST': '',             # Set to empty string for localhost. Not used with sqlite3. | ||||
|         'DATABASE_PORT': '',             # Set to empty string for default. Not used with sqlite3. | ||||
|         'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. | ||||
|         'NAME': '',                      # Or path to database file if using sqlite3. | ||||
|         'USER': '',                      # Not used with sqlite3. | ||||
|         'PASSWORD': '',                  # Not used with sqlite3. | ||||
|         'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3. | ||||
|         'PORT': '',                      # Set to empty string for default. Not used with sqlite3. | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| # Local time zone for this installation. Choices can be found here: | ||||
| # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name | ||||
| # although not all choices may be available on all operating systems. | ||||
|   | ||||
| @@ -5,7 +5,7 @@ class USStateField(Field): | ||||
|         return "USStateField" | ||||
|  | ||||
|     def db_type(self, connection): | ||||
|         if connection.settings_dict['DATABASE_ENGINE'] == 'oracle': | ||||
|         if connection.settings_dict['ENGINE'] == 'django.db.backends.oracle': | ||||
|             return 'CHAR(2)' | ||||
|         else: | ||||
|             return 'varchar(2)' | ||||
| @@ -21,7 +21,7 @@ class PhoneNumberField(Field): | ||||
|         return "PhoneNumberField" | ||||
|  | ||||
|     def db_type(self, connection): | ||||
|         if connection.settings_dict['DATABASE_ENGINE'] == 'oracle': | ||||
|         if connection.settings_dict['ENGINE'] == 'django.db.backends.oracle': | ||||
|             return 'VARCHAR2(20)' | ||||
|         else: | ||||
|             return 'varchar(20)' | ||||
|   | ||||
| @@ -49,7 +49,7 @@ class Command(NoArgsCommand): | ||||
|     and return each table to the state it was in after syncdb. | ||||
|     Are you sure you want to do this? | ||||
|  | ||||
|         Type 'yes' to continue, or 'no' to cancel: """ % connection.settings_dict['DATABASE_NAME']) | ||||
|         Type 'yes' to continue, or 'no' to cancel: """ % connection.settings_dict['NAME']) | ||||
|             else: | ||||
|                 confirm = 'yes' | ||||
|  | ||||
| @@ -65,7 +65,7 @@ class Command(NoArgsCommand): | ||||
|           * At least one of the expected database tables doesn't exist. | ||||
|           * The SQL was invalid. | ||||
|         Hint: Look at the output of 'django-admin.py sqlflush'. That's the SQL this command wasn't able to run. | ||||
|         The full error: %s""" % (connection.settings_dict.DATABASE_NAME, e)) | ||||
|         The full error: %s""" % (connection.settings_dict['NAME'], e)) | ||||
|                 transaction.commit_unless_managed(using=db) | ||||
|  | ||||
|                 # Emit the post sync signal. This allows individual | ||||
|   | ||||
| @@ -35,7 +35,7 @@ This will IRREVERSIBLY DESTROY any data for | ||||
| the "%s" application in the database "%s". | ||||
| Are you sure you want to do this? | ||||
|  | ||||
| Type 'yes' to continue, or 'no' to cancel: """ % (app_name, connection.settings_dict['DATABASE_NAME'])) | ||||
| Type 'yes' to continue, or 'no' to cancel: """ % (app_name, connection.settings_dict['NAME'])) | ||||
|         else: | ||||
|             confirm = 'yes' | ||||
|  | ||||
|   | ||||
| @@ -17,12 +17,13 @@ except NameError: | ||||
| def sql_create(app, style, connection): | ||||
|     "Returns a list of the CREATE TABLE SQL statements for the given app." | ||||
|  | ||||
|     if connection.settings_dict['DATABASE_ENGINE'] == 'dummy': | ||||
|     if connection.settings_dict['ENGINE'] == 'django.db.backends.dummy': | ||||
|         # This must be the "dummy" database backend, which means the user | ||||
|         # hasn't set DATABASE_ENGINE. | ||||
|         # hasn't set ENGINE for the databse. | ||||
|         raise CommandError("Django doesn't know which syntax to use for your SQL statements,\n" + | ||||
|             "because you haven't specified the DATABASE_ENGINE setting.\n" + | ||||
|             "Edit your settings file and change DATABASE_ENGINE to something like 'postgresql' or 'mysql'.") | ||||
|             "because you haven't specified the ENGINE setting for the database.\n" + | ||||
|             "Edit your settings file and change DATBASES['default']['ENGINE'] to something like\n" + | ||||
|             "'django.db.backends.postgresql' or 'django.db.backends.mysql'") | ||||
|  | ||||
|     # Get installed models, so we generate REFERENCES right. | ||||
|     # We trim models from the current app so that the sqlreset command does not | ||||
| @@ -162,7 +163,8 @@ def custom_sql_for_model(model, style, connection): | ||||
|     statements = re.compile(r";[ \t]*$", re.M) | ||||
|  | ||||
|     # Find custom SQL, if it's available. | ||||
|     sql_files = [os.path.join(app_dir, "%s.%s.sql" % (opts.object_name.lower(), connection.settings_dict['DATABASE_ENGINE'])), | ||||
|     backend_name = connection.settings_dict['ENGINE'].split('.')[-1] | ||||
|     sql_files = [os.path.join(app_dir, "%s.%s.sql" % (opts.object_name.lower(), backend_name)), | ||||
|                  os.path.join(app_dir, "%s.sql" % opts.object_name.lower())] | ||||
|     for sql_file in sql_files: | ||||
|         if os.path.exists(sql_file): | ||||
|   | ||||
| @@ -9,22 +9,31 @@ __all__ = ('backend', 'connection', 'connections', 'DatabaseError', | ||||
|  | ||||
| DEFAULT_DB_ALIAS = 'default' | ||||
|  | ||||
| if not settings.DATABASES or DEFAULT_DB_ALIAS not in settings.DATABASES: | ||||
|     settings.DATABASES[DEFAULT_DB_ALIAS] = { | ||||
|         'DATABASE_ENGINE': settings.DATABASE_ENGINE, | ||||
|         'DATABASE_HOST': settings.DATABASE_HOST, | ||||
|         'DATABASE_NAME': settings.DATABASE_NAME, | ||||
|         'DATABASE_OPTIONS': settings.DATABASE_OPTIONS, | ||||
|         'DATABASE_PASSWORD': settings.DATABASE_PASSWORD, | ||||
|         'DATABASE_PORT': settings.DATABASE_PORT, | ||||
|         'DATABASE_USER': settings.DATABASE_USER, | ||||
|         'TIME_ZONE': settings.TIME_ZONE, | ||||
| # For backwards compatibility - Port any old database settings over to | ||||
| # the new values. | ||||
| if not settings.DATABASES: | ||||
|     import warnings | ||||
|     warnings.warn( | ||||
|         "settings.DATABASE_* is deprecated; use settings.DATABASES instead.", | ||||
|         PendingDeprecationWarning | ||||
|     ) | ||||
|  | ||||
|         'TEST_DATABASE_CHARSET': settings.TEST_DATABASE_CHARSET, | ||||
|         'TEST_DATABASE_COLLATION': settings.TEST_DATABASE_COLLATION, | ||||
|         'TEST_DATABASE_NAME': settings.TEST_DATABASE_NAME, | ||||
|     settings.DATABASES[DEFAULT_DB_ALIAS] = { | ||||
|         'ENGINE': settings.DATABASE_ENGINE, | ||||
|         'HOST': settings.DATABASE_HOST, | ||||
|         'NAME': settings.DATABASE_NAME, | ||||
|         'OPTIONS': settings.DATABASE_OPTIONS, | ||||
|         'PASSWORD': settings.DATABASE_PASSWORD, | ||||
|         'PORT': settings.DATABASE_PORT, | ||||
|         'USER': settings.DATABASE_USER, | ||||
|         'TEST_CHARSET': settings.TEST_DATABASE_CHARSET, | ||||
|         'TEST_COLLATION': settings.TEST_DATABASE_COLLATION, | ||||
|         'TEST_NAME': settings.TEST_DATABASE_NAME, | ||||
|     } | ||||
|  | ||||
| if DEFAULT_DB_ALIAS not in settings.DATABASES: | ||||
|     raise ImproperlyConfigured("You must default a '%s' database" % DEFAULT_DB_ALIAS) | ||||
|  | ||||
| connections = ConnectionHandler(settings.DATABASES) | ||||
|  | ||||
|  | ||||
| @@ -38,7 +47,7 @@ connections = ConnectionHandler(settings.DATABASES) | ||||
| # we load all these up for backwards compatibility, you should use | ||||
| # connections['default'] instead. | ||||
| connection = connections[DEFAULT_DB_ALIAS] | ||||
| backend = load_backend(connection.settings_dict['DATABASE_ENGINE']) | ||||
| backend = load_backend(connection.settings_dict['ENGINE']) | ||||
| DatabaseError = backend.DatabaseError | ||||
| IntegrityError = backend.IntegrityError | ||||
|  | ||||
|   | ||||
| @@ -29,9 +29,8 @@ class BaseDatabaseWrapper(local): | ||||
|  | ||||
|     def __init__(self, settings_dict, alias=DEFAULT_DB_ALIAS): | ||||
|         # `settings_dict` should be a dictionary containing keys such as | ||||
|         # DATABASE_NAME, DATABASE_USER, etc. It's called `settings_dict` | ||||
|         # instead of `settings` to disambiguate it from Django settings | ||||
|         # modules. | ||||
|         # NAME, USER, etc. It's called `settings_dict` instead of `settings` | ||||
|         # to disambiguate it from Django settings modules. | ||||
|         self.connection = None | ||||
|         self.queries = [] | ||||
|         self.settings_dict = settings_dict | ||||
|   | ||||
| @@ -327,13 +327,10 @@ class BaseDatabaseCreation(object): | ||||
|         test_database_name = self._create_test_db(verbosity, autoclobber) | ||||
|  | ||||
|         self.connection.close() | ||||
|         self.connection.settings_dict["DATABASE_NAME"] = test_database_name | ||||
|         self.connection.settings_dict["NAME"] = test_database_name | ||||
|         can_rollback = self._rollback_works() | ||||
|         self.connection.settings_dict["DATABASE_SUPPORTS_TRANSACTIONS"] = can_rollback | ||||
|         self.connection.settings_dict["SUPPORTS_TRANSACTIONS"] = can_rollback | ||||
|  | ||||
|         # FIXME we end up loading the same fixture into the default DB for each | ||||
|         # DB we have, this causes various test failures, but can't really be | ||||
|         # fixed until we have an API for saving to a specific DB | ||||
|         call_command('syncdb', verbosity=verbosity, interactive=False, database=self.connection.alias) | ||||
|  | ||||
|         if settings.CACHE_BACKEND.startswith('db://'): | ||||
| @@ -351,10 +348,10 @@ class BaseDatabaseCreation(object): | ||||
|         "Internal implementation - creates the test db tables." | ||||
|         suffix = self.sql_table_creation_suffix() | ||||
|  | ||||
|         if self.connection.settings_dict['TEST_DATABASE_NAME']: | ||||
|             test_database_name = self.connection.settings_dict['TEST_DATABASE_NAME'] | ||||
|         if self.connection.settings_dict['TEST_NAME']: | ||||
|             test_database_name = self.connection.settings_dict['TEST_NAME'] | ||||
|         else: | ||||
|             test_database_name = TEST_DATABASE_PREFIX + self.connection.settings_dict['DATABASE_NAME'] | ||||
|             test_database_name = TEST_DATABASE_PREFIX + self.connection.settings_dict['NAME'] | ||||
|  | ||||
|         qn = self.connection.ops.quote_name | ||||
|  | ||||
| @@ -406,8 +403,8 @@ class BaseDatabaseCreation(object): | ||||
|         if verbosity >= 1: | ||||
|             print "Destroying test database '%s'..." % self.connection.alias | ||||
|         self.connection.close() | ||||
|         test_database_name = self.connection.settings_dict['DATABASE_NAME'] | ||||
|         self.connection.settings_dict['DATABASE_NAME'] = old_database_name | ||||
|         test_database_name = self.connection.settings_dict['NAME'] | ||||
|         self.connection.settings_dict['NAME'] = old_database_name | ||||
|  | ||||
|         self._destroy_test_db(test_database_name, verbosity) | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| """ | ||||
| Dummy database backend for Django. | ||||
|  | ||||
| Django uses this if the DATABASE_ENGINE setting is empty (None or empty string). | ||||
| Django uses this if the database ENGINE setting is empty (None or empty string). | ||||
|  | ||||
| Each of these API functions, except connection.close(), raises | ||||
| ImproperlyConfigured. | ||||
| @@ -12,7 +12,7 @@ from django.db.backends import * | ||||
| from django.db.backends.creation import BaseDatabaseCreation | ||||
|  | ||||
| def complain(*args, **kwargs): | ||||
|     raise ImproperlyConfigured, "You haven't set the DATABASE_ENGINE setting yet." | ||||
|     raise ImproperlyConfigured, "You haven't set the database ENGINE setting yet." | ||||
|  | ||||
| def ignore(*args, **kwargs): | ||||
|     pass | ||||
|   | ||||
| @@ -262,22 +262,22 @@ class DatabaseWrapper(BaseDatabaseWrapper): | ||||
|                 'use_unicode': True, | ||||
|             } | ||||
|             settings_dict = self.settings_dict | ||||
|             if settings_dict['DATABASE_USER']: | ||||
|                 kwargs['user'] = settings_dict['DATABASE_USER'] | ||||
|             if settings_dict['DATABASE_NAME']: | ||||
|                 kwargs['db'] = settings_dict['DATABASE_NAME'] | ||||
|             if settings_dict['DATABASE_PASSWORD']: | ||||
|                 kwargs['passwd'] = settings_dict['DATABASE_PASSWORD'] | ||||
|             if settings_dict['DATABASE_HOST'].startswith('/'): | ||||
|                 kwargs['unix_socket'] = settings_dict['DATABASE_HOST'] | ||||
|             elif settings_dict['DATABASE_HOST']: | ||||
|                 kwargs['host'] = settings_dict['DATABASE_HOST'] | ||||
|             if settings_dict['DATABASE_PORT']: | ||||
|                 kwargs['port'] = int(settings_dict['DATABASE_PORT']) | ||||
|             if settings_dict['USER']: | ||||
|                 kwargs['user'] = settings_dict['USER'] | ||||
|             if settings_dict['NAME']: | ||||
|                 kwargs['db'] = settings_dict['NAME'] | ||||
|             if settings_dict['PASSWORD']: | ||||
|                 kwargs['passwd'] = settings_dict['PASSWORD'] | ||||
|             if settings_dict['HOST'].startswith('/'): | ||||
|                 kwargs['unix_socket'] = settings_dict['HOST'] | ||||
|             elif settings_dict['HOST']: | ||||
|                 kwargs['host'] = settings_dict['HOST'] | ||||
|             if settings_dict['PORT']: | ||||
|                 kwargs['port'] = int(settings_dict['PORT']) | ||||
|             # We need the number of potentially affected rows after an | ||||
|             # "UPDATE", not the number of changed rows. | ||||
|             kwargs['client_flag'] = CLIENT.FOUND_ROWS | ||||
|             kwargs.update(settings_dict['DATABASE_OPTIONS']) | ||||
|             kwargs.update(settings_dict['OPTIONS']) | ||||
|             self.connection = Database.connect(**kwargs) | ||||
|             self.connection.encoders[SafeUnicode] = self.connection.encoders[unicode] | ||||
|             self.connection.encoders[SafeString] = self.connection.encoders[str] | ||||
|   | ||||
| @@ -9,12 +9,12 @@ class DatabaseClient(BaseDatabaseClient): | ||||
|     def runshell(self): | ||||
|         settings_dict = self.connection.settings_dict | ||||
|         args = [self.executable_name] | ||||
|         db = settings_dict['DATABASE_OPTIONS'].get('db', settings_dict['DATABASE_NAME']) | ||||
|         user = settings_dict['DATABASE_OPTIONS'].get('user', settings_dict['DATABASE_USER']) | ||||
|         passwd = settings_dict['DATABASE_OPTIONS'].get('passwd', settings_dict['DATABASE_PASSWORD']) | ||||
|         host = settings_dict['DATABASE_OPTIONS'].get('host', settings_dict['DATABASE_HOST']) | ||||
|         port = settings_dict['DATABASE_OPTIONS'].get('port', settings_dict['DATABASE_PORT']) | ||||
|         defaults_file = settings_dict['DATABASE_OPTIONS'].get('read_default_file') | ||||
|         db = settings_dict['OPTIONS'].get('db', settings_dict['NAME']) | ||||
|         user = settings_dict['OPTIONS'].get('user', settings_dict['USER']) | ||||
|         passwd = settings_dict['OPTIONS'].get('passwd', settings_dict['PASSWORD']) | ||||
|         host = settings_dict['OPTIONS'].get('host', settings_dict['HOST']) | ||||
|         port = settings_dict['OPTIONS'].get('port', settings_dict['PORT']) | ||||
|         defaults_file = settings_dict['OPTIONS'].get('read_default_file') | ||||
|         # Seems to be no good way to set sql_mode with CLI. | ||||
|  | ||||
|         if defaults_file: | ||||
|   | ||||
| @@ -30,10 +30,10 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|  | ||||
|     def sql_table_creation_suffix(self): | ||||
|         suffix = [] | ||||
|         if self.connection.settings_dict['TEST_DATABASE_CHARSET']: | ||||
|             suffix.append('CHARACTER SET %s' % self.connection.settings_dict['TEST_DATABASE_CHARSET']) | ||||
|         if self.connection.settings_dict['TEST_DATABASE_COLLATION']: | ||||
|             suffix.append('COLLATE %s' % self.connection.settings_dict['TEST_DATABASE_COLLATION']) | ||||
|         if self.connection.settings_dict['TEST_CHARSET']: | ||||
|             suffix.append('CHARACTER SET %s' % self.connection.settings_dict['TEST_CHARSET']) | ||||
|         if self.connection.settings_dict['TEST_COLLATION']: | ||||
|             suffix.append('COLLATE %s' % self.connection.settings_dict['TEST_COLLATION']) | ||||
|         return ' '.join(suffix) | ||||
|  | ||||
|     def sql_for_inline_foreign_key_references(self, field, known_models, style): | ||||
|   | ||||
| @@ -342,22 +342,22 @@ class DatabaseWrapper(BaseDatabaseWrapper): | ||||
|  | ||||
|     def _connect_string(self): | ||||
|         settings_dict = self.settings_dict | ||||
|         if len(settings_dict['DATABASE_HOST'].strip()) == 0: | ||||
|             settings_dict['DATABASE_HOST'] = 'localhost' | ||||
|         if len(settings_dict['DATABASE_PORT'].strip()) != 0: | ||||
|             dsn = Database.makedsn(settings_dict['DATABASE_HOST'], | ||||
|                                    int(settings_dict['DATABASE_PORT']), | ||||
|                                    settings_dict['DATABASE_NAME']) | ||||
|         if len(settings_dict['HOST'].strip()) == 0: | ||||
|             settings_dict['HOST'] = 'localhost' | ||||
|         if len(settings_dict['PORT'].strip()) != 0: | ||||
|             dsn = Database.makedsn(settings_dict['HOST'], | ||||
|                                    int(settings_dict['PORT']), | ||||
|                                    settings_dict['NAME']) | ||||
|         else: | ||||
|             dsn = settings_dict['DATABASE_NAME'] | ||||
|         return "%s/%s@%s" % (settings_dict['DATABASE_USER'], | ||||
|                              settings_dict['DATABASE_PASSWORD'], dsn) | ||||
|             dsn = settings_dict['NAME'] | ||||
|         return "%s/%s@%s" % (settings_dict['USER'], | ||||
|                              settings_dict['PASSWORD'], dsn) | ||||
|  | ||||
|     def _cursor(self): | ||||
|         cursor = None | ||||
|         if not self._valid_connection(): | ||||
|             conn_string = convert_unicode(self._connect_string()) | ||||
|             self.connection = Database.connect(conn_string, **self.settings_dict['DATABASE_OPTIONS']) | ||||
|             self.connection = Database.connect(conn_string, **self.settings_dict['OPTIONS']) | ||||
|             cursor = FormatStylePlaceholderCursor(self.connection) | ||||
|             # Set oracle date to ansi date format.  This only needs to execute | ||||
|             # once when we create a new connection. We also set the Territory | ||||
|   | ||||
| @@ -41,22 +41,22 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|     remember = {} | ||||
|  | ||||
|     def _create_test_db(self, verbosity=1, autoclobber=False): | ||||
|         TEST_DATABASE_NAME = self._test_database_name() | ||||
|         TEST_DATABASE_USER = self._test_database_user() | ||||
|         TEST_DATABASE_PASSWD = self._test_database_passwd() | ||||
|         TEST_DATABASE_TBLSPACE = self._test_database_tblspace() | ||||
|         TEST_DATABASE_TBLSPACE_TMP = self._test_database_tblspace_tmp() | ||||
|         TEST_NAME = self._test_database_name() | ||||
|         TEST_USER = self._test_database_user() | ||||
|         TEST_PASSWD = self._test_database_passwd() | ||||
|         TEST_TBLSPACE = self._test_database_tblspace() | ||||
|         TEST_TBLSPACE_TMP = self._test_database_tblspace_tmp() | ||||
|  | ||||
|         parameters = { | ||||
|             'dbname': TEST_DATABASE_NAME, | ||||
|             'user': TEST_DATABASE_USER, | ||||
|             'password': TEST_DATABASE_PASSWD, | ||||
|             'tblspace': TEST_DATABASE_TBLSPACE, | ||||
|             'tblspace_temp': TEST_DATABASE_TBLSPACE_TMP, | ||||
|             'dbname': TEST_NAME, | ||||
|             'user': TEST_USER, | ||||
|             'password': TEST_PASSWD, | ||||
|             'tblspace': TEST_TBLSPACE, | ||||
|             'tblspace_temp': TEST_TBLSPACE_TMP, | ||||
|         } | ||||
|  | ||||
|         self.remember['user'] = self.connection.settings_dict['DATABASE_USER'] | ||||
|         self.remember['passwd'] = self.connection.settings_dict['DATABASE_PASSWORD'] | ||||
|         self.remember['user'] = self.connection.settings_dict['USER'] | ||||
|         self.remember['passwd'] = self.connection.settings_dict['PASSWORD'] | ||||
|  | ||||
|         cursor = self.connection.cursor() | ||||
|         if self._test_database_create(): | ||||
| @@ -67,7 +67,7 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|             except Exception, e: | ||||
|                 sys.stderr.write("Got an error creating the test database: %s\n" % e) | ||||
|                 if not autoclobber: | ||||
|                     confirm = raw_input("It appears the test database, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % TEST_DATABASE_NAME) | ||||
|                     confirm = raw_input("It appears the test database, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % TEST_NAME) | ||||
|                 if autoclobber or confirm == 'yes': | ||||
|                     try: | ||||
|                         if verbosity >= 1: | ||||
| @@ -91,7 +91,7 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|             except Exception, e: | ||||
|                 sys.stderr.write("Got an error creating the test user: %s\n" % e) | ||||
|                 if not autoclobber: | ||||
|                     confirm = raw_input("It appears the test user, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % TEST_DATABASE_USER) | ||||
|                     confirm = raw_input("It appears the test user, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % TEST_USER) | ||||
|                 if autoclobber or confirm == 'yes': | ||||
|                     try: | ||||
|                         if verbosity >= 1: | ||||
| @@ -107,35 +107,35 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|                     print "Tests cancelled." | ||||
|                     sys.exit(1) | ||||
|  | ||||
|         self.connection.settings_dict['TEST_DATABASE_USER'] = self.connection.settings_dict["DATABASE_USER"] = TEST_DATABASE_USER | ||||
|         self.connection.settings_dict["DATABASE_PASSWORD"] = TEST_DATABASE_PASSWD | ||||
|         self.connection.settings_dict['TEST_USER'] = self.connection.settings_dict["USER"] = TEST_USER | ||||
|         self.connection.settings_dict["PASSWORD"] = TEST_PASSWD | ||||
|  | ||||
|         return self.connection.settings_dict['DATABASE_NAME'] | ||||
|         return self.connection.settings_dict['NAME'] | ||||
|  | ||||
|     def _destroy_test_db(self, test_database_name, verbosity=1): | ||||
|         """ | ||||
|         Destroy a test database, prompting the user for confirmation if the | ||||
|         database already exists. Returns the name of the test database created. | ||||
|         """ | ||||
|         TEST_DATABASE_NAME = self._test_database_name() | ||||
|         TEST_DATABASE_USER = self._test_database_user() | ||||
|         TEST_DATABASE_PASSWD = self._test_database_passwd() | ||||
|         TEST_DATABASE_TBLSPACE = self._test_database_tblspace() | ||||
|         TEST_DATABASE_TBLSPACE_TMP = self._test_database_tblspace_tmp() | ||||
|         TEST_NAME = self._test_database_name() | ||||
|         TEST_USER = self._test_database_user() | ||||
|         TEST_PASSWD = self._test_database_passwd() | ||||
|         TEST_TBLSPACE = self._test_database_tblspace() | ||||
|         TEST_TBLSPACE_TMP = self._test_database_tblspace_tmp() | ||||
|  | ||||
|         self.connection.settings_dict["DATABASE_USER"] = self.remember['user'] | ||||
|         self.connection.settings_dict["DATABASE_PASSWORD"] = self.remember['passwd'] | ||||
|         self.connection.settings_dict["USER"] = self.remember['user'] | ||||
|         self.connection.settings_dict["PASSWORD"] = self.remember['passwd'] | ||||
|  | ||||
|         parameters = { | ||||
|             'dbname': TEST_DATABASE_NAME, | ||||
|             'user': TEST_DATABASE_USER, | ||||
|             'password': TEST_DATABASE_PASSWD, | ||||
|             'tblspace': TEST_DATABASE_TBLSPACE, | ||||
|             'tblspace_temp': TEST_DATABASE_TBLSPACE_TMP, | ||||
|             'dbname': TEST_NAME, | ||||
|             'user': TEST_USER, | ||||
|             'password': TEST_PASSWD, | ||||
|             'tblspace': TEST_TBLSPACE, | ||||
|             'tblspace_temp': TEST_TBLSPACE_TMP, | ||||
|         } | ||||
|  | ||||
|         self.remember['user'] = self.connection.settings_dict['DATABASE_USER'] | ||||
|         self.remember['passwd'] = self.connection.settings_dict['DATABASE_PASSWORD'] | ||||
|         self.remember['user'] = self.connection.settings_dict['USER'] | ||||
|         self.remember['passwd'] = self.connection.settings_dict['PASSWORD'] | ||||
|  | ||||
|         cursor = self.connection.cursor() | ||||
|         time.sleep(1) # To avoid "database is being accessed by other users" errors. | ||||
| @@ -207,10 +207,10 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|                 raise | ||||
|  | ||||
|     def _test_database_name(self): | ||||
|         name = TEST_DATABASE_PREFIX + self.connection.settings_dict['DATABASE_NAME'] | ||||
|         name = TEST_DATABASE_PREFIX + self.connection.settings_dict['NAME'] | ||||
|         try: | ||||
|             if self.connection.settings_dict['TEST_DATABASE_NAME']: | ||||
|                 name = self.connection.settings_dict['TEST_DATABASE_NAME'] | ||||
|             if self.connection.settings_dict['TEST_NAME']: | ||||
|                 name = self.connection.settings_dict['TEST_NAME'] | ||||
|         except AttributeError: | ||||
|             pass | ||||
|         except: | ||||
| @@ -220,7 +220,7 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|     def _test_database_create(self): | ||||
|         name = True | ||||
|         try: | ||||
|             if self.connection.settings_dict['TEST_DATABASE_CREATE']: | ||||
|             if self.connection.settings_dict['TEST_CREATE']: | ||||
|                 name = True | ||||
|             else: | ||||
|                 name = False | ||||
| @@ -244,10 +244,10 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|         return name | ||||
|  | ||||
|     def _test_database_user(self): | ||||
|         name = TEST_DATABASE_PREFIX + self.connection.settings_dict['DATABASE_USER'] | ||||
|         name = TEST_DATABASE_PREFIX + self.connection.settings_dict['USER'] | ||||
|         try: | ||||
|             if self.connection.settings_dict['TEST_DATABASE_USER']: | ||||
|                 name = self.connection.settings_dict['TEST_DATABASE_USER'] | ||||
|             if self.connection.settings_dict['TEST_USER']: | ||||
|                 name = self.connection.settings_dict['TEST_USER'] | ||||
|         except KeyError: | ||||
|             pass | ||||
|         except: | ||||
| @@ -257,8 +257,8 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|     def _test_database_passwd(self): | ||||
|         name = PASSWORD | ||||
|         try: | ||||
|             if self.connection.settings_dict['TEST_DATABASE_PASSWD']: | ||||
|                 name = self.connection.settings_dict['TEST_DATABASE_PASSWD'] | ||||
|             if self.connection.settings_dict['TEST_PASSWD']: | ||||
|                 name = self.connection.settings_dict['TEST_PASSWD'] | ||||
|         except KeyError: | ||||
|             pass | ||||
|         except: | ||||
| @@ -266,10 +266,10 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|         return name | ||||
|  | ||||
|     def _test_database_tblspace(self): | ||||
|         name = TEST_DATABASE_PREFIX + self.connection.settings_dict['DATABASE_NAME'] | ||||
|         name = TEST_DATABASE_PREFIX + self.connection.settings_dict['NAME'] | ||||
|         try: | ||||
|             if self.connection.settings_dict['TEST_DATABASE_TBLSPACE']: | ||||
|                 name = self.connection.settings_dict['TEST_DATABASE_TBLSPACE'] | ||||
|             if self.connection.settings_dict['TEST_TBLSPACE']: | ||||
|                 name = self.connection.settings_dict['TEST_TBLSPACE'] | ||||
|         except KeyError: | ||||
|             pass | ||||
|         except: | ||||
| @@ -277,10 +277,10 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|         return name | ||||
|  | ||||
|     def _test_database_tblspace_tmp(self): | ||||
|         name = TEST_DATABASE_PREFIX + self.connection.settings_dict['DATABASE_NAME'] + '_temp' | ||||
|         name = TEST_DATABASE_PREFIX + self.connection.settings_dict['NAME'] + '_temp' | ||||
|         try: | ||||
|             if self.connection.settings_dict['TEST_DATABASE_TBLSPACE_TMP']: | ||||
|                 name = self.connection.settings_dict['TEST_DATABASE_TBLSPACE_TMP'] | ||||
|             if self.connection.settings_dict['TEST_TBLSPACE_TMP']: | ||||
|                 name = self.connection.settings_dict['TEST_TBLSPACE_TMP'] | ||||
|         except KeyError: | ||||
|             pass | ||||
|         except: | ||||
|   | ||||
| @@ -101,19 +101,19 @@ class DatabaseWrapper(BaseDatabaseWrapper): | ||||
|         settings_dict = self.settings_dict | ||||
|         if self.connection is None: | ||||
|             set_tz = True | ||||
|             if settings_dict['DATABASE_NAME'] == '': | ||||
|             if settings_dict['NAME'] == '': | ||||
|                 from django.core.exceptions import ImproperlyConfigured | ||||
|                 raise ImproperlyConfigured("You need to specify DATABASE_NAME in your Django settings file.") | ||||
|             conn_string = "dbname=%s" % settings_dict['DATABASE_NAME'] | ||||
|             if settings_dict['DATABASE_USER']: | ||||
|                 conn_string = "user=%s %s" % (settings_dict['DATABASE_USER'], conn_string) | ||||
|             if settings_dict['DATABASE_PASSWORD']: | ||||
|                 conn_string += " password='%s'" % settings_dict['DATABASE_PASSWORD'] | ||||
|             if settings_dict['DATABASE_HOST']: | ||||
|                 conn_string += " host=%s" % settings_dict['DATABASE_HOST'] | ||||
|             if settings_dict['DATABASE_PORT']: | ||||
|                 conn_string += " port=%s" % settings_dict['DATABASE_PORT'] | ||||
|             self.connection = Database.connect(conn_string, **settings_dict['DATABASE_OPTIONS']) | ||||
|                 raise ImproperlyConfigured("You need to specify NAME in your Django settings file.") | ||||
|             conn_string = "dbname=%s" % settings_dict['NAME'] | ||||
|             if settings_dict['USER']: | ||||
|                 conn_string = "user=%s %s" % (settings_dict['USER'], conn_string) | ||||
|             if settings_dict['PASSWORD']: | ||||
|                 conn_string += " password='%s'" % settings_dict['PASSWORD'] | ||||
|             if settings_dict['HOST']: | ||||
|                 conn_string += " host=%s" % settings_dict['HOST'] | ||||
|             if settings_dict['PORT']: | ||||
|                 conn_string += " port=%s" % settings_dict['PORT'] | ||||
|             self.connection = Database.connect(conn_string, **settings_dict['OPTIONS']) | ||||
|             self.connection.set_isolation_level(1) # make transactions transparent to all cursors | ||||
|             connection_created.send(sender=self.__class__) | ||||
|         cursor = self.connection.cursor() | ||||
| @@ -142,7 +142,7 @@ def typecast_string(s): | ||||
| try: | ||||
|     Database.register_type(Database.new_type((1082,), "DATE", util.typecast_date)) | ||||
| except AttributeError: | ||||
|     raise Exception("You appear to be using psycopg version 2. Set your DATABASE_ENGINE to 'postgresql_psycopg2' instead of 'postgresql'.") | ||||
|     raise Exception("You appear to be using psycopg version 2. Set your DATABASES.ENGINE to 'postgresql_psycopg2' instead of 'postgresql'.") | ||||
| Database.register_type(Database.new_type((1083,1266), "TIME", util.typecast_time)) | ||||
| Database.register_type(Database.new_type((1114,1184), "TIMESTAMP", util.typecast_timestamp)) | ||||
| Database.register_type(Database.new_type((16,), "BOOLEAN", util.typecast_boolean)) | ||||
|   | ||||
| @@ -9,13 +9,13 @@ class DatabaseClient(BaseDatabaseClient): | ||||
|     def runshell(self): | ||||
|         settings_dict = self.connection.settings_dict | ||||
|         args = [self.executable_name] | ||||
|         if settings_dict['DATABASE_USER']: | ||||
|             args += ["-U", settings_dict['DATABASE_USER']] | ||||
|         if settings_dict['DATABASE_HOST']: | ||||
|             args.extend(["-h", settings_dict['DATABASE_HOST']]) | ||||
|         if settings_dict['DATABASE_PORT']: | ||||
|             args.extend(["-p", str(settings_dict['DATABASE_PORT'])]) | ||||
|         args += [settings_dict['DATABASE_NAME']] | ||||
|         if settings_dict['USER']: | ||||
|             args += ["-U", settings_dict['USER']] | ||||
|         if settings_dict['HOST']: | ||||
|             args.extend(["-h", settings_dict['HOST']]) | ||||
|         if settings_dict['PORT']: | ||||
|             args.extend(["-p", str(settings_dict['PORT'])]) | ||||
|         args += [settings_dict['NAME']] | ||||
|         if os.name == 'nt': | ||||
|             sys.exit(os.system(" ".join(args))) | ||||
|         else: | ||||
|   | ||||
| @@ -29,7 +29,7 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|     } | ||||
|  | ||||
|     def sql_table_creation_suffix(self): | ||||
|         assert self.connection.settings_dict['TEST_DATABASE_COLLATION'] is None, "PostgreSQL does not support collation setting at database creation time." | ||||
|         if self.connection.settings_dict['TEST_DATABASE_CHARSET']: | ||||
|             return "WITH ENCODING '%s'" % self.connection.settings_dict['TEST_DATABASE_CHARSET'] | ||||
|         assert self.connection.settings_dict['TEST_COLLATION'] is None, "PostgreSQL does not support collation setting at database creation time." | ||||
|         if self.connection.settings_dict['TEST_CHARSET']: | ||||
|             return "WITH ENCODING '%s'" % self.connection.settings_dict['TEST_CHARSET'] | ||||
|         return '' | ||||
|   | ||||
| @@ -63,7 +63,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): | ||||
|         super(DatabaseWrapper, self).__init__(*args, **kwargs) | ||||
|  | ||||
|         self.features = DatabaseFeatures() | ||||
|         autocommit = self.settings_dict["DATABASE_OPTIONS"].get('autocommit', False) | ||||
|         autocommit = self.settings_dict["OPTIONS"].get('autocommit', False) | ||||
|         self.features.uses_autocommit = autocommit | ||||
|         self._set_isolation_level(int(not autocommit)) | ||||
|         self.ops = DatabaseOperations(self) | ||||
| @@ -77,23 +77,23 @@ class DatabaseWrapper(BaseDatabaseWrapper): | ||||
|         settings_dict = self.settings_dict | ||||
|         if self.connection is None: | ||||
|             set_tz = True | ||||
|             if settings_dict['DATABASE_NAME'] == '': | ||||
|             if settings_dict['NAME'] == '': | ||||
|                 from django.core.exceptions import ImproperlyConfigured | ||||
|                 raise ImproperlyConfigured("You need to specify DATABASE_NAME in your Django settings file.") | ||||
|                 raise ImproperlyConfigured("You need to specify NAME in your Django settings file.") | ||||
|             conn_params = { | ||||
|                 'database': settings_dict['DATABASE_NAME'], | ||||
|                 'database': settings_dict['NAME'], | ||||
|             } | ||||
|             conn_params.update(settings_dict['DATABASE_OPTIONS']) | ||||
|             conn_params.update(settings_dict['OPTIONS']) | ||||
|             if 'autocommit' in conn_params: | ||||
|                 del conn_params['autocommit'] | ||||
|             if settings_dict['DATABASE_USER']: | ||||
|                 conn_params['user'] = settings_dict['DATABASE_USER'] | ||||
|             if settings_dict['DATABASE_PASSWORD']: | ||||
|                 conn_params['password'] = settings_dict['DATABASE_PASSWORD'] | ||||
|             if settings_dict['DATABASE_HOST']: | ||||
|                 conn_params['host'] = settings_dict['DATABASE_HOST'] | ||||
|             if settings_dict['DATABASE_PORT']: | ||||
|                 conn_params['port'] = settings_dict['DATABASE_PORT'] | ||||
|             if settings_dict['USER']: | ||||
|                 conn_params['user'] = settings_dict['USER'] | ||||
|             if settings_dict['PASSWORD']: | ||||
|                 conn_params['password'] = settings_dict['PASSWORD'] | ||||
|             if settings_dict['HOST']: | ||||
|                 conn_params['host'] = settings_dict['HOST'] | ||||
|             if settings_dict['PORT']: | ||||
|                 conn_params['port'] = settings_dict['PORT'] | ||||
|             self.connection = Database.connect(**conn_params) | ||||
|             self.connection.set_client_encoding('UTF8') | ||||
|             self.connection.set_isolation_level(self.isolation_level) | ||||
|   | ||||
| @@ -159,14 +159,14 @@ class DatabaseWrapper(BaseDatabaseWrapper): | ||||
|     def _cursor(self): | ||||
|         if self.connection is None: | ||||
|             settings_dict = self.settings_dict | ||||
|             if not settings_dict['DATABASE_NAME']: | ||||
|             if not settings_dict['NAME']: | ||||
|                 from django.core.exceptions import ImproperlyConfigured | ||||
|                 raise ImproperlyConfigured, "Please fill out DATABASE_NAME in the settings module before using the database." | ||||
|                 raise ImproperlyConfigured, "Please fill out the database NAME in the settings module before using the database." | ||||
|             kwargs = { | ||||
|                 'database': settings_dict['DATABASE_NAME'], | ||||
|                 'database': settings_dict['NAME'], | ||||
|                 'detect_types': Database.PARSE_DECLTYPES | Database.PARSE_COLNAMES, | ||||
|             } | ||||
|             kwargs.update(settings_dict['DATABASE_OPTIONS']) | ||||
|             kwargs.update(settings_dict['OPTIONS']) | ||||
|             self.connection = Database.connect(**kwargs) | ||||
|             # Register extract, date_trunc, and regexp functions. | ||||
|             self.connection.create_function("django_extract", 2, _sqlite_extract) | ||||
| @@ -179,7 +179,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): | ||||
|         # If database is in memory, closing the connection destroys the | ||||
|         # database. To prevent accidental data loss, ignore close requests on | ||||
|         # an in-memory db. | ||||
|         if self.settings_dict['DATABASE_NAME'] != ":memory:": | ||||
|         if self.settings_dict['NAME'] != ":memory:": | ||||
|             BaseDatabaseWrapper.close(self) | ||||
|  | ||||
| class SQLiteCursorWrapper(Database.Cursor): | ||||
|   | ||||
| @@ -8,7 +8,7 @@ class DatabaseClient(BaseDatabaseClient): | ||||
|  | ||||
|     def runshell(self): | ||||
|         args = [self.executable_name, | ||||
|                 self.connection.settings_dict['DATABASE_NAME']] | ||||
|                 self.connection.settings_dict['NAME']] | ||||
|         if os.name == 'nt': | ||||
|             sys.exit(os.system(" ".join(args))) | ||||
|         else: | ||||
|   | ||||
| @@ -38,7 +38,7 @@ class DatabaseCreation(BaseDatabaseCreation): | ||||
|         return [] | ||||
|  | ||||
|     def _create_test_db(self, verbosity, autoclobber): | ||||
|         test_database_name = self.connection.settings_dict['TEST_DATABASE_NAME'] | ||||
|         test_database_name = self.connection.settings_dict['TEST_NAME'] | ||||
|         if test_database_name and test_database_name != ":memory:": | ||||
|             # Erase the old test database | ||||
|             if verbosity >= 1: | ||||
|   | ||||
| @@ -6,13 +6,15 @@ from django.utils.importlib import import_module | ||||
|  | ||||
| def load_backend(backend_name): | ||||
|     try: | ||||
|         # Most of the time, the database backend will be one of the official | ||||
|         # backends that ships with Django, so look there first. | ||||
|         return import_module('.base', 'django.db.backends.%s' % backend_name) | ||||
|         module = import_module('.base', 'django.db.backends.%s' % backend_name) | ||||
|         import warnings | ||||
|         warnings.warn( | ||||
|             "Short names for DATABASE_ENGINE are deprecated; prepend with 'django.db.backends.'", | ||||
|             PendingDeprecationWarning | ||||
|         ) | ||||
|         return module | ||||
|     except ImportError, e: | ||||
|         raise | ||||
|         # If the import failed, we might be looking for a database backend | ||||
|         # distributed external to Django. So we'll try that next. | ||||
|         # Look for a fully qualified database backend name | ||||
|         try: | ||||
|             return import_module('.base', backend_name) | ||||
|         except ImportError, e_user: | ||||
| @@ -50,14 +52,13 @@ class ConnectionHandler(object): | ||||
|             conn = self.databases[alias] | ||||
|         except KeyError: | ||||
|             raise ConnectionDoesNotExist("The connection %s doesn't exist" % alias) | ||||
|         conn.setdefault('DATABASE_ENGINE', 'dummy') | ||||
|         conn.setdefault('DATABASE_OPTIONS', {}) | ||||
|         conn.setdefault('TEST_DATABASE_CHARSET', None) | ||||
|         conn.setdefault('TEST_DATABASE_COLLATION', None) | ||||
|         conn.setdefault('TEST_DATABASE_NAME', None) | ||||
|         conn.setdefault('ENGINE', 'dummy') | ||||
|         conn.setdefault('OPTIONS', {}) | ||||
|         conn.setdefault('TEST_CHARSET', None) | ||||
|         conn.setdefault('TEST_COLLATION', None) | ||||
|         conn.setdefault('TEST_NAME', None) | ||||
|         conn.setdefault('TIME_ZONE', settings.TIME_ZONE) | ||||
|         for setting in ('DATABASE_NAME', 'DATABASE_USER', 'DATABASE_PASSWORD', | ||||
|             'DATABASE_HOST', 'DATABASE_PORT'): | ||||
|         for setting in ('NAME', 'USER', 'PASSWORD', 'HOST', 'PORT'): | ||||
|             conn.setdefault(setting, '') | ||||
|  | ||||
|     def __getitem__(self, alias): | ||||
| @@ -66,7 +67,7 @@ class ConnectionHandler(object): | ||||
|  | ||||
|         self.ensure_defaults(alias) | ||||
|         db = self.databases[alias] | ||||
|         backend = load_backend(db['DATABASE_ENGINE']) | ||||
|         backend = load_backend(db['ENGINE']) | ||||
|         conn = backend.DatabaseWrapper(db, alias) | ||||
|         self._connections[alias] = conn | ||||
|         return conn | ||||
|   | ||||
| @@ -190,7 +190,7 @@ def run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[]): | ||||
|     from django.db import connections | ||||
|     for alias in connections: | ||||
|         connection = connections[alias] | ||||
|         old_names.append((connection, connection.settings_dict['DATABASE_NAME'])) | ||||
|         old_names.append((connection, connection.settings_dict['NAME'])) | ||||
|         connection.creation.create_test_db(verbosity, autoclobber=not interactive) | ||||
|     result = unittest.TextTestRunner(verbosity=verbosity).run(suite) | ||||
|     for connection, old_name in old_names: | ||||
|   | ||||
| @@ -446,7 +446,7 @@ def connections_support_transactions(): | ||||
|     Returns True if all connections support transactions.  This is messy | ||||
|     because 2.4 doesn't support any or all. | ||||
|     """ | ||||
|     return all(conn.settings_dict['DATABASE_SUPPORTS_TRANSACTIONS'] | ||||
|     return all(conn.settings_dict['SUPPORTS_TRANSACTIONS'] | ||||
|         for conn in connections.all()) | ||||
|  | ||||
| class TestCase(TransactionTestCase): | ||||
|   | ||||
| @@ -809,7 +809,7 @@ EMPTY_URLCONF_TEMPLATE = """ | ||||
| <div id="instructions"> | ||||
|   <p>Of course, you haven't actually done any work yet. Here's what to do next:</p> | ||||
|   <ul> | ||||
|     <li>If you plan to use a database, edit the <code>DATABASE_*</code> settings in <code>{{ project_name }}/settings.py</code>.</li> | ||||
|     <li>If you plan to use a database, edit the <code>DATABASES</code> setting in <code>{{ project_name }}/settings.py</code>.</li> | ||||
|     <li>Start your first app by running <code>python {{ project_name }}/manage.py startapp [appname]</code>.</li> | ||||
|   </ul> | ||||
| </div> | ||||
|   | ||||
| @@ -290,13 +290,13 @@ If you aim to build a database-agnostic application, you should account for | ||||
| differences in database column types. For example, the date/time column type | ||||
| in PostgreSQL is called ``timestamp``, while the same column in MySQL is called | ||||
| ``datetime``. The simplest way to handle this in a ``db_type()`` method is to | ||||
| check the ``connection.settings_dict['DATABASE_ENGINE']`` attribute. | ||||
| check the ``connection.settings_dict['ENGINE']`` attribute. | ||||
|  | ||||
| For example:: | ||||
|  | ||||
|     class MyDateField(models.Field): | ||||
|         def db_type(self, connection): | ||||
|             if connection.settings_dict['DATABASE_ENGINE'] == 'mysql': | ||||
|             if connection.settings_dict['ENGINE'] == 'django.db.backends.mysql': | ||||
|                 return 'datetime' | ||||
|             else: | ||||
|                 return 'timestamp' | ||||
|   | ||||
| @@ -118,23 +118,27 @@ The SQL files are read by the :djadmin:`sqlcustom`, :djadmin:`sqlreset`, | ||||
| <ref-django-admin>`. Refer to the :ref:`manage.py documentation | ||||
| <ref-django-admin>` for more information. | ||||
|  | ||||
| Note that if you have multiple SQL data files, there's no guarantee of the order | ||||
| in which they're executed. The only thing you can assume is that, by the time | ||||
| your custom data files are executed, all the database tables already will have | ||||
| been created. | ||||
| Note that if you have multiple SQL data files, there's no guarantee of | ||||
| the order in which they're executed. The only thing you can assume is | ||||
| that, by the time your custom data files are executed, all the | ||||
| database tables already will have been created. | ||||
|  | ||||
| Database-backend-specific SQL data | ||||
| ---------------------------------- | ||||
|  | ||||
| There's also a hook for backend-specific SQL data. For example, you can have | ||||
| separate initial-data files for PostgreSQL and MySQL. For each app, Django | ||||
| looks for a file called ``<appname>/sql/<modelname>.<backend>.sql``, where | ||||
| ``<appname>`` is your app directory, ``<modelname>`` is the model's name in | ||||
| lowercase and ``<backend>`` is the value of ``DATABASE_ENGINE`` for the given | ||||
| database being set up in your settings file (e.g., ``postgresql``, ``mysql``). | ||||
| There's also a hook for backend-specific SQL data. For example, you | ||||
| can have separate initial-data files for PostgreSQL and MySQL. For | ||||
| each app, Django looks for a file called | ||||
| ``<appname>/sql/<modelname>.<backend>.sql``, where ``<appname>`` is | ||||
| your app directory, ``<modelname>`` is the model's name in lowercase | ||||
| and ``<backend>`` is the last part of the module name provided for the | ||||
| :setting:`ENGINE` in your settings file (e.g., if you have defined a | ||||
| database with an :setting:`ENGINE` value of | ||||
| ``django.db.backends.postgresql``, Django will look for | ||||
| ``<appname>/sql/<modelname>.postgresql.sql``). | ||||
|  | ||||
| Backend-specific SQL data is executed before non-backend-specific SQL data. For | ||||
| example, if your app contains the files ``sql/person.sql`` and | ||||
| ``sql/person.postgresql.sql`` and you're installing the app on PostgreSQL, | ||||
| Django will execute the contents of ``sql/person.postgresql.sql`` first, then | ||||
| ``sql/person.sql``. | ||||
| Backend-specific SQL data is executed before non-backend-specific SQL | ||||
| data. For example, if your app contains the files ``sql/person.sql`` | ||||
| and ``sql/person.postgresql.sql`` and you're installing the app on | ||||
| PostgreSQL, Django will execute the contents of | ||||
| ``sql/person.postgresql.sql`` first, then ``sql/person.sql``. | ||||
|   | ||||
| @@ -19,15 +19,15 @@ Give Django your database parameters | ||||
|  | ||||
| You'll need to tell Django what your database connection parameters are, and | ||||
| what the name of the database is. Do that by editing the :setting:`DATABASES` | ||||
| setting and assigning values to the following keys in the ``'default'`` | ||||
| dictionary: | ||||
| setting and assigning values to the following keys for the ``'default'`` | ||||
| connection: | ||||
|  | ||||
|     * ``DATABASE_NAME`` | ||||
|     * ``DATABASE_ENGINE`` | ||||
|     * ``DATABASE_USER`` | ||||
|     * ``DATABASE_PASSWORD`` | ||||
|     * ``DATABASE_HOST`` | ||||
|     * ``DATABASE_PORT`` | ||||
|     * :setting:`NAME` | ||||
|     * :setting:`ENGINE` | ||||
|     * :setting:`USER` | ||||
|     * :setting:`PASSWORD` | ||||
|     * :setting:`HOST` | ||||
|     * :setting:`PORT` | ||||
|  | ||||
| Auto-generate the models | ||||
| ======================== | ||||
|   | ||||
| @@ -763,18 +763,18 @@ info. Your :setting:`DATABASES` setting needs to define two databases: | ||||
|       want. It doesn't need to use the same backend as the ``default`` | ||||
|       database (although it can use the same backend if you want to). | ||||
|  | ||||
| If you're using the ``sqlite3`` database backend, you need to define | ||||
| :setting:`DATABASE_ENGINE` for both databases, plus a | ||||
| :setting:`TEST_DATABASE_NAME` for the ``other`` database. The | ||||
| If you're using the SQLite database backend, you need to define | ||||
| :setting:`ENGINE` for both databases, plus a | ||||
| :setting:`TEST_NAME` for the ``other`` database. The | ||||
| following is a minimal settings file that can be used to test SQLite:: | ||||
|  | ||||
|     DATABASES = { | ||||
|         'default': { | ||||
|             'DATABASE_ENGINE': 'sqlite3' | ||||
|             'ENGINE': 'django.db.backends.sqlite3' | ||||
|         }, | ||||
|         'other': { | ||||
|             'DATABASE_ENGINE': 'sqlite3', | ||||
|             'TEST_DATABASE_NAME: 'other_db' | ||||
|             'ENGINE': 'django.db.backends.sqlite3', | ||||
|             'TEST_NAME: 'other_db' | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -782,22 +782,22 @@ following is a minimal settings file that can be used to test SQLite:: | ||||
| If you're using another backend, you will need to provide other details for | ||||
| each database: | ||||
|  | ||||
|     * The :setting:`DATABASE_USER` option for each of your databases needs to | ||||
|     * The :setting:`USER` option for each of your databases needs to | ||||
|       specify an existing user account for the database. | ||||
|  | ||||
|     * The :setting:`DATABASE_PASSWORD` option needs to provide the password for | ||||
|       the :setting:`DATABASE_USER` that has been specified. | ||||
|     * The :setting:`PASSWORD` option needs to provide the password for | ||||
|       the :setting:`USER` that has been specified. | ||||
|  | ||||
|     * The :setting:`DATABASE_NAME` option must be the name of an existing database to | ||||
|     * The :setting:`NAME` option must be the name of an existing database to | ||||
|       which the given user has permission to connect. The unit tests will not | ||||
|       touch this database; the test runner creates a new database whose name is | ||||
|       :setting:`DATABASE_NAME` prefixed with ``test_``, and this test database is | ||||
|       :setting:`NAME` prefixed with ``test_``, and this test database is | ||||
|       deleted when the tests are finished. This means your user account needs | ||||
|       permission to execute ``CREATE DATABASE``. | ||||
|  | ||||
| You will also need to ensure that your database uses UTF-8 as the default | ||||
| character set. If your database server doesn't use UTF-8 as a default charset, | ||||
| you will need to include a value for ``TEST_DATABASE_CHARSET`` in the settings | ||||
| you will need to include a value for ``TEST_CHARSET`` in the settings | ||||
| dictionary for the applicable database. | ||||
|  | ||||
| If you want to run the full suite of tests, you'll need to install a number of | ||||
|   | ||||
| @@ -158,35 +158,40 @@ It worked! | ||||
| Database setup | ||||
| -------------- | ||||
|  | ||||
| Now, edit :file:`settings.py`. It's a normal Python module with module-level | ||||
| variables representing Django settings. Change the following keys in the | ||||
| :setting:`DATABASES` ``'default'`` item to match your databases connection | ||||
| settings. | ||||
| Now, edit :file:`settings.py`. It's a normal Python module with | ||||
| module-level variables representing Django settings. Change the | ||||
| following keys in the :setting:`DATABASES` ``'default'`` item to match | ||||
| your databases connection settings. | ||||
|  | ||||
|     * ``DATABASE_ENGINE`` -- Either 'postgresql_psycopg2', 'mysql' or | ||||
|       'sqlite3'. Other backends are :setting:`also available <DATABASE_ENGINE>`. | ||||
|     * :setting:`ENGINE` -- Either | ||||
|       ``'django.db.backends.postgresql_psycopg2'``, | ||||
|       ``'django.db.backends.mysql'`` or | ||||
|       ``'django.db.backends.sqlite3'``. Other backends are | ||||
|       :setting:`also available <ENGINE>`. | ||||
|  | ||||
|     * ``DATABASE_NAME`` -- The name of your database. If you're using | ||||
|       SQLite, the database will be a file on your computer; in that case, | ||||
|       ``DATABASE_NAME`` should be the full absolute path, including filename, of | ||||
|       that file. If the file doesn't exist, it will automatically be created | ||||
|       when you synchronize the database for the first time (see below). | ||||
|     * :setting:`NAME` -- The name of your database. If you're using | ||||
|       SQLite, the database will be a file on your computer; in that | ||||
|       case, :setting:`NAME` should be the full absolute path, | ||||
|       including filename, of that file. If the file doesn't exist, it | ||||
|       will automatically be created when you synchronize the database | ||||
|       for the first time (see below). | ||||
|  | ||||
|       When specifying the path, always use forward slashes, even on Windows | ||||
|       (e.g. ``C:/homes/user/mysite/sqlite3.db``). | ||||
|       When specifying the path, always use forward slashes, even on | ||||
|       Windows (e.g. ``C:/homes/user/mysite/sqlite3.db``). | ||||
|  | ||||
|     * ``DATABASE_USER`` -- Your database username (not used for SQLite). | ||||
|     * :setting:`USER` -- Your database username (not used for SQLite). | ||||
|  | ||||
|     * ``DATABASE_PASSWORD`` -- Your database password (not used for | ||||
|     * :setting:`PASSWORD` -- Your database password (not used for | ||||
|       SQLite). | ||||
|  | ||||
|     * ``DATABASE_HOST`` -- The host your database is on. Leave this as an | ||||
|       empty string if your database server is on the same physical machine (not | ||||
|       used for SQLite). | ||||
|     * :setting:`HOST` -- The host your database is on. Leave this as | ||||
|       an empty string if your database server is on the same physical | ||||
|       machine (not used for SQLite). | ||||
|  | ||||
| If you're new to databases, we recommend simply using SQLite (by setting | ||||
| ``DATABASE_ENGINE`` to ``'sqlite3'``). SQLite is included as part of | ||||
| Python 2.5 and later, so you won't need to install anything else. | ||||
| If you're new to databases, we recommend simply using SQLite (by | ||||
| setting :setting:`ENGINE` to ``'django.db.backends.sqlite3'``). SQLite | ||||
| is included as part of Python 2.5 and later, so you won't need to | ||||
| install anything else. | ||||
|  | ||||
| .. note:: | ||||
|  | ||||
|   | ||||
| @@ -28,8 +28,8 @@ Compiles .po files to .mo files for use with builtin gettext support. | ||||
| Creates the table needed to use the SQL cache backend | ||||
| .TP | ||||
| .B dbshell | ||||
| Runs the command\-line client for the current | ||||
| .BI DATABASE_ENGINE. | ||||
| Runs the command\-line client for the specified | ||||
| .BI database ENGINE. | ||||
| .TP | ||||
| .B diffsettings | ||||
| Displays differences between the current | ||||
|   | ||||
| @@ -44,18 +44,20 @@ Autocommit mode | ||||
|  | ||||
| .. versionadded:: 1.1 | ||||
|  | ||||
| If your application is particularly read-heavy and doesn't make many database | ||||
| writes, the overhead of a constantly open transaction can sometimes be | ||||
| noticeable. For those situations, if you're using the ``postgresql_psycopg2`` | ||||
| backend, you can configure Django to use *"autocommit"* behavior for the | ||||
| connection, meaning that each database operation will normally be in its own | ||||
| transaction, rather than having the transaction extend over multiple | ||||
| operations. In this case, you can still manually start a transaction if you're | ||||
| doing something that requires consistency across multiple database operations. | ||||
| The autocommit behavior is enabled by setting the ``autocommit`` key in the | ||||
| ``DATABASE_OPTIONS`` part of your database in :setting:`DATABASES`:: | ||||
| If your application is particularly read-heavy and doesn't make many | ||||
| database writes, the overhead of a constantly open transaction can | ||||
| sometimes be noticeable. For those situations, if you're using the | ||||
| ``postgresql_psycopg2`` backend, you can configure Django to use | ||||
| *"autocommit"* behavior for the connection, meaning that each database | ||||
| operation will normally be in its own transaction, rather than having | ||||
| the transaction extend over multiple operations. In this case, you can | ||||
| still manually start a transaction if you're doing something that | ||||
| requires consistency across multiple database operations. The | ||||
| autocommit behavior is enabled by setting the ``autocommit`` key in | ||||
| the :setting:`OPTIONS` part of your database configuration in | ||||
| :setting:`DATABASES`:: | ||||
|  | ||||
|     DATABASE_OPTIONS = { | ||||
|     OPTIONS = { | ||||
|         "autocommit": True, | ||||
|     } | ||||
|  | ||||
| @@ -67,11 +69,11 @@ objects are changed or none of them are. | ||||
| .. admonition:: This is database-level autocommit | ||||
|  | ||||
|     This functionality is not the same as the | ||||
|     :ref:`topics-db-transactions-autocommit` decorator. That decorator is a | ||||
|     Django-level implementation that commits automatically after data changing | ||||
|     operations. The feature enabled using the ``DATABASE_OPTIONS`` option | ||||
|     provides autocommit behavior at the database adapter level. It commits | ||||
|     after *every* operation. | ||||
|     :ref:`topics-db-transactions-autocommit` decorator. That decorator | ||||
|     is a Django-level implementation that commits automatically after | ||||
|     data changing operations. The feature enabled using the | ||||
|     :setting:`OPTIONS` option provides autocommit behavior at the | ||||
|     database adapter level. It commits after *every* operation. | ||||
|  | ||||
| If you are using this feature and performing an operation akin to delete or | ||||
| updating that requires multiple operations, you are strongly recommended to | ||||
| @@ -234,14 +236,13 @@ Refer to the :ref:`settings documentation <ref-settings>`. | ||||
|  | ||||
| Connection settings are used in this order: | ||||
|  | ||||
|     1. ``DATABASE_OPTIONS``. | ||||
|     2. ``DATABASE_NAME``, ``DATABASE_USER``, | ||||
|        ``DATABASE_PASSWORD``, ``DATABASE_HOST``, | ||||
|        ``DATABASE_PORT`` | ||||
|     1. :setting:`OPTIONS`. | ||||
|     2. :setting:`NAME`, :setting:`USER`, :setting:`PASSWORD`, | ||||
|        :setting:`HOST`, :setting:`PORT` | ||||
|     3. MySQL option files. | ||||
|  | ||||
| In other words, if you set the name of the database in ``DATABASE_OPTIONS``, | ||||
| this will take precedence over ``DATABASE_NAME``, which would override | ||||
| In other words, if you set the name of the database in ``OPTIONS``, | ||||
| this will take precedence over ``NAME``, which would override | ||||
| anything in a `MySQL option file`_. | ||||
|  | ||||
| Here's a sample configuration which uses a MySQL option file:: | ||||
| @@ -249,8 +250,8 @@ Here's a sample configuration which uses a MySQL option file:: | ||||
|     # settings.py | ||||
|     DATABASES = { | ||||
|         'default': { | ||||
|             'DATABASE_ENGINE': "mysql", | ||||
|             'DATABASE_OPTIONS': { | ||||
|             'ENGINE': 'django.db.backends.mysql', | ||||
|             'OPTIONS': { | ||||
|                 'read_default_file': '/path/to/my.cnf', | ||||
|             }, | ||||
|         } | ||||
| @@ -258,9 +259,9 @@ Here's a sample configuration which uses a MySQL option file:: | ||||
|  | ||||
|     # my.cnf | ||||
|     [client] | ||||
|     database = DATABASE_NAME | ||||
|     user = DATABASE_USER | ||||
|     password = DATABASE_PASSWORD | ||||
|     database = NAME | ||||
|     user = USER | ||||
|     password = PASSWORD | ||||
|     default-character-set = utf8 | ||||
|  | ||||
| Several other MySQLdb connection options may be useful, such as ``ssl``, | ||||
| @@ -291,7 +292,7 @@ storage engine, you have a couple of options. | ||||
|     * Another option is to use the ``init_command`` option for MySQLdb prior to | ||||
|       creating your tables:: | ||||
|  | ||||
|           DATABASE_OPTIONS = { | ||||
|           OPTIONS = { | ||||
|              "init_command": "SET storage_engine=INNODB", | ||||
|           } | ||||
|  | ||||
| @@ -456,7 +457,7 @@ If you're getting this error, you can solve it by: | ||||
|     * Increase the default timeout value by setting the ``timeout`` database | ||||
|       option option:: | ||||
|  | ||||
|           DATABASE_OPTIONS = { | ||||
|           OPTIONS = { | ||||
|               # ... | ||||
|              "timeout": 20, | ||||
|               # ... | ||||
| @@ -511,32 +512,32 @@ Your Django settings.py file should look something like this for Oracle:: | ||||
|  | ||||
|     DATABASES = { | ||||
|         'default': { | ||||
|             'DATABASE_ENGINE': 'oracle', | ||||
|             'DATABASE_NAME': 'xe', | ||||
|             'DATABASE_USER': 'a_user', | ||||
|             'DATABASE_PASSWORD': 'a_password', | ||||
|             'DATABASE_HOST': '', | ||||
|             'DATABASE_PORT': ''     , | ||||
|             'ENGINE': 'django.db.backends.oracle', | ||||
|             'NAME': 'xe', | ||||
|             'USER': 'a_user', | ||||
|             'PASSWORD': 'a_password', | ||||
|             'HOST': '', | ||||
|             'PORT': ''     , | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
| If you don't use a ``tnsnames.ora`` file or a similar naming method that | ||||
| recognizes the SID ("xe" in this example), then fill in both | ||||
| ``DATABASE_HOST`` and ``DATABASE_PORT`` like so:: | ||||
| ``HOST`` and ``PORT`` like so:: | ||||
|  | ||||
|     DATABASES = { | ||||
|         'default': { | ||||
|             'DATABASE_ENGINE': 'oracle', | ||||
|             'DATABASE_NAME': 'xe', | ||||
|             'DATABASE_USER': 'a_user', | ||||
|             'DATABASE_PASSWORD': 'a_password', | ||||
|             'DATABASE_HOST': 'dbprod01ned.mycompany.com', | ||||
|             'DATABASE_PORT': '1540', | ||||
|             'ENGINE': 'django.db.backends.oracle', | ||||
|             'NAME': 'xe', | ||||
|             'USER': 'a_user', | ||||
|             'PASSWORD': 'a_password', | ||||
|             'HOST': 'dbprod01ned.mycompany.com', | ||||
|             'PORT': '1540', | ||||
|         } | ||||
|     } | ||||
|  | ||||
| You should supply both ``DATABASE_HOST`` and ``DATABASE_PORT``, or leave both | ||||
| You should supply both ``HOST`` and ``PORT``, or leave both | ||||
| as empty strings. | ||||
|  | ||||
| Tablespace options | ||||
|   | ||||
| @@ -160,8 +160,8 @@ dbshell | ||||
| .. django-admin:: dbshell | ||||
|  | ||||
| Runs the command-line client for the database engine specified in your | ||||
| ``DATABASE_ENGINE`` setting, with the connection parameters specified in your | ||||
| ``DATABASE_USER``, ``DATABASE_PASSWORD``, etc., settings. | ||||
| ``ENGINE`` setting, with the connection parameters specified in your | ||||
| ``USER``, ``PASSWORD``, etc., settings. | ||||
|  | ||||
|     * For PostgreSQL, this runs the ``psql`` command-line client. | ||||
|     * For MySQL, this runs the ``mysql`` command-line client. | ||||
| @@ -265,7 +265,7 @@ inspectdb | ||||
| .. django-admin:: inspectdb | ||||
|  | ||||
| Introspects the database tables in the database pointed-to by the | ||||
| ``DATABASE_NAME`` setting and outputs a Django model module (a ``models.py`` | ||||
| ``NAME`` setting and outputs a Django model module (a ``models.py`` | ||||
| file) to standard output. | ||||
|  | ||||
| Use this if you have a legacy database with which you'd like to use Django. | ||||
|   | ||||
| @@ -195,41 +195,60 @@ end users) indicating the reason the request was rejected.  See | ||||
| DATABASES | ||||
| --------- | ||||
|  | ||||
| .. versionadded: 1.2 | ||||
|  | ||||
| Default: ``{}`` (Empty dictionary) | ||||
|  | ||||
| This is a dictionary containg the settings for all databases to be used with | ||||
| Django.  It is a nested dictionary who's contents maps aliases to a dictionary | ||||
| containing the options for an individual database.  The following inner options | ||||
| are used: | ||||
| A dictionary containing the settings for all databases to be used with | ||||
| Django. It is a nested dictionary who's contents maps database aliases | ||||
| to a dictionary containing the options for an individual database. | ||||
|  | ||||
| .. deprecated: 1.2 | ||||
| The :setting:`DATABASES` setting must configure a ``default`` database; | ||||
| any number of additional databases may also be specified. | ||||
|  | ||||
|     In versions of Django prior to 1.2 each of the following were | ||||
|     individual settings. The usage of the standalone database settings | ||||
|     has been deprecated, and will be removed in Django 1.4. | ||||
| The simplest possible settings file is for a single-database setup using | ||||
| SQLite. This can be configured using the following:: | ||||
|     DATABASES = { | ||||
|         'default': { | ||||
|             'BACKEND': 'django.db.backends.sqlite3', | ||||
|             'NAME': 'mydatabase' | ||||
|         } | ||||
|     } | ||||
|  | ||||
| .. setting:: DATABASE_ENGINE | ||||
| For other database backends, or more complex SQLite configurations, other options | ||||
| will be required. The following inner options are available. | ||||
|  | ||||
| DATABASE_ENGINE | ||||
| ~~~~~~~~~~~~~~~ | ||||
| .. setting:: ENGINE | ||||
|  | ||||
| ENGINE | ||||
| ~~~~~~ | ||||
|  | ||||
| Default: ``''`` (Empty string) | ||||
|  | ||||
| The database backend to use. The built-in database backends are | ||||
| ``'postgresql_psycopg2'``, ``'postgresql'``, ``'mysql'``, ``'sqlite3'``, and | ||||
| ``'oracle'``. | ||||
| The database backend to use. The built-in database backends are: | ||||
|  | ||||
|     * ``'django.db.backends.postgresql_psycopg2'`` | ||||
|     * ``'django.db.backends.postgresql'`` | ||||
|     * ``'django.db.backends.mysql'`` | ||||
|     * ``'django.db.backends.sqlite3'`` | ||||
|     * ``'django.db.backends.oracle'`` | ||||
|  | ||||
| You can use a database backend that doesn't ship with Django by setting | ||||
| ``DATABASE_ENGINE`` to a fully-qualified path (i.e. | ||||
| ``ENGINE`` to a fully-qualified path (i.e. | ||||
| ``mypackage.backends.whatever``). Writing a whole new database backend from | ||||
| scratch is left as an exercise to the reader; see the other backends for | ||||
| examples. | ||||
|  | ||||
| .. versionadded:: 1.0 | ||||
|     Support for external database backends is new in 1.0. | ||||
| .. note:: | ||||
|     Prior to Django 1.2, you could use a short version of the backend name | ||||
|     to reference the built-in database backends (e.g., you could use | ||||
|     ``'sqlite3'`` to refer to the SQLite backend). This format has been | ||||
|     deprecated, and will be removed in Django 1.4. | ||||
|  | ||||
| DATABASE_HOST | ||||
| ~~~~~~~~~~~~~ | ||||
| .. setting:: HOST | ||||
|  | ||||
| HOST | ||||
| ~~~~ | ||||
|  | ||||
| Default: ``''`` (Empty string) | ||||
|  | ||||
| @@ -239,7 +258,7 @@ localhost. Not used with SQLite. | ||||
| If this value starts with a forward slash (``'/'``) and you're using MySQL, | ||||
| MySQL will connect via a Unix socket to the specified socket. For example:: | ||||
|  | ||||
|     "DATABASE_HOST": '/var/run/mysql' | ||||
|     "HOST": '/var/run/mysql' | ||||
|  | ||||
| If you're using MySQL and this value *doesn't* start with a forward slash, then | ||||
| this value is assumed to be the host. | ||||
| @@ -249,8 +268,10 @@ for the connection, rather than a network connection to localhost. If you | ||||
| explicitly need to use a TCP/IP connection on the local machine with | ||||
| PostgreSQL, specify ``localhost`` here. | ||||
|  | ||||
| DATABASE_NAME | ||||
| ~~~~~~~~~~~~~ | ||||
| .. setting:: NAME | ||||
|  | ||||
| NAME | ||||
| ~~~~ | ||||
|  | ||||
| Default: ``''`` (Empty string) | ||||
|  | ||||
| @@ -258,41 +279,48 @@ The name of the database to use. For SQLite, it's the full path to the database | ||||
| file. When specifying the path, always use forward slashes, even on Windows | ||||
| (e.g. ``C:/homes/user/mysite/sqlite3.db``). | ||||
|  | ||||
| DATABASE_OPTIONS | ||||
| ~~~~~~~~~~~~~~~~ | ||||
| .. setting:: OPTIONS | ||||
|  | ||||
| OPTIONS | ||||
| ~~~~~~~ | ||||
|  | ||||
| Default: ``{}`` (Empty dictionary) | ||||
|  | ||||
| Extra parameters to use when connecting to the database. Consult backend | ||||
| module's document for available keywords. | ||||
|  | ||||
| DATABASE_PASSWORD | ||||
| ~~~~~~~~~~~~~~~~~ | ||||
| .. setting:: PASSWORD | ||||
|  | ||||
| PASSWORD | ||||
| ~~~~~~~~ | ||||
|  | ||||
| Default: ``''`` (Empty string) | ||||
|  | ||||
| The password to use when connecting to the database. Not used with SQLite. | ||||
|  | ||||
| DATABASE_PORT | ||||
| ~~~~~~~~~~~~~ | ||||
| .. setting:: PORT | ||||
|  | ||||
| PORT | ||||
| ~~~~ | ||||
|  | ||||
| Default: ``''`` (Empty string) | ||||
|  | ||||
| The port to use when connecting to the database. An empty string means the | ||||
| default port. Not used with SQLite. | ||||
|  | ||||
| DATABASE_USER | ||||
| ~~~~~~~~~~~~~ | ||||
| .. setting:: USER | ||||
|  | ||||
| USER | ||||
| ~~~~ | ||||
|  | ||||
| Default: ``''`` (Empty string) | ||||
|  | ||||
| The username to use when connecting to the database. Not used with SQLite. | ||||
|  | ||||
| .. setting:: TEST_CHARSET | ||||
|  | ||||
| TEST_DATABASE_CHARSET | ||||
| ~~~~~~~~~~~~~~~~~~~~~ | ||||
|  | ||||
| .. versionadded:: 1.0 | ||||
| TEST_CHARSET | ||||
| ~~~~~~~~~~~~ | ||||
|  | ||||
| Default: ``None`` | ||||
|  | ||||
| @@ -306,11 +334,10 @@ MySQL_ (``mysql``) backends. | ||||
| .. _PostgreSQL: http://www.postgresql.org/docs/8.2/static/multibyte.html | ||||
| .. _MySQL: http://www.mysql.org/doc/refman/5.0/en/charset-database.html | ||||
|  | ||||
| .. setting:: TEST_COLLATION | ||||
|  | ||||
| TEST_DATABASE_COLLATION | ||||
| ~~~~~~~~~~~~~~~~~~~~~~~ | ||||
|  | ||||
| .. versionadded:: 1.0 | ||||
| TEST_COLLATION | ||||
| ~~~~~~~~~~~~~~ | ||||
|  | ||||
| Default: ``None`` | ||||
|  | ||||
| @@ -322,8 +349,10 @@ manual for details). | ||||
|  | ||||
| .. _section 10.3.2: http://www.mysql.org/doc/refman/5.0/en/charset-database.html | ||||
|  | ||||
| TEST_DATABASE_NAME | ||||
| ~~~~~~~~~~~~~~~~~~ | ||||
| .. setting:: TEST_NAME | ||||
|  | ||||
| TEST_NAME | ||||
| ~~~~~~~~~ | ||||
|  | ||||
| Default: ``None`` | ||||
|  | ||||
| @@ -1292,3 +1321,79 @@ Different locales have different formats. For example, U.S. English would say | ||||
|  | ||||
| See :ttag:`allowed date format strings <now>`. See also ``DATE_FORMAT``, | ||||
| ``DATETIME_FORMAT``, ``TIME_FORMAT`` and ``MONTH_DAY_FORMAT``. | ||||
|  | ||||
| Deprecated settings | ||||
| =================== | ||||
|  | ||||
| .. setting:: DATABASE_ENGINE | ||||
|  | ||||
| DATABASE_ENGINE | ||||
| --------------- | ||||
|  | ||||
| .. deprecated:: 1.2 | ||||
|    This setting has been replaced by :setting:`ENGINE` in | ||||
|    :setting:`DATABASES`. | ||||
|  | ||||
| DATABASE_HOST | ||||
| ------------- | ||||
|  | ||||
| .. deprecated:: 1.2 | ||||
|    This setting has been replaced by :setting:`HOST` in | ||||
|    :setting:`DATABASES`. | ||||
|  | ||||
| DATABASE_NAME | ||||
| ------------- | ||||
|  | ||||
| .. deprecated:: 1.2 | ||||
|    This setting has been replaced by :setting:`NAME` in | ||||
|    :setting:`DATABASES`. | ||||
|  | ||||
| DATABASE_OPTIONS | ||||
| ---------------- | ||||
|  | ||||
| .. deprecated:: 1.2 | ||||
|    This setting has been replaced by :setting:`OPTIONS` in | ||||
|    :setting:`DATABASES`. | ||||
|  | ||||
| DATABASE_PASSWORD | ||||
| ----------------- | ||||
|  | ||||
| .. deprecated:: 1.2 | ||||
|    This setting has been replaced by :setting:`PASSWORD` in | ||||
|    :setting:`DATABASES`. | ||||
|  | ||||
| DATABASE_PORT | ||||
| ------------- | ||||
|  | ||||
| .. deprecated:: 1.2 | ||||
|    This setting has been replaced by :setting:`PORT` in | ||||
|    :setting:`DATABASES`. | ||||
|  | ||||
| DATABASE_USER | ||||
| ------------- | ||||
|  | ||||
| .. deprecated:: 1.2 | ||||
|    This setting has been replaced by :setting:`USER` in | ||||
|    :setting:`DATABASES`. | ||||
|  | ||||
| TEST_DATABASE_CHARSET | ||||
| --------------------- | ||||
|  | ||||
| .. deprecated:: 1.2 | ||||
|    This setting has been replaced by :setting:`TEST_CHARSET` in | ||||
|    :setting:`DATABASES`. | ||||
|  | ||||
| TEST_DATABASE_COLLATION | ||||
| ----------------------- | ||||
|  | ||||
| .. deprecated:: 1.2 | ||||
|    This setting has been replaced by :setting:`TEST_COLLATION` in | ||||
|    :setting:`DATABASES`. | ||||
|  | ||||
| TEST_DATABASE_NAME | ||||
| ------------------ | ||||
|  | ||||
| .. deprecated:: 1.2 | ||||
|    This setting has been replaced by :setting:`TEST_NAME` in | ||||
|    :setting:`DATABASES`. | ||||
|  | ||||
|   | ||||
| @@ -96,7 +96,7 @@ support: | ||||
|     * The ``sqlinitialdata`` command has been renamed to ``sqlcustom`` to | ||||
|       emphasize that ``loaddata`` should be used for data (and ``sqlcustom`` for | ||||
|       other custom SQL -- views, stored procedures, etc.). | ||||
|        | ||||
|  | ||||
|     * The vestigial ``install`` command has been removed. Use ``syncdb``. | ||||
|  | ||||
| Backslash escaping changed | ||||
| @@ -179,20 +179,20 @@ strings that referred to callables were allowed). This allows a much more | ||||
| natural use of URLconfs. For example, this URLconf:: | ||||
|  | ||||
|     from django.conf.urls.defaults import * | ||||
|      | ||||
|     urlpatterns = patterns('',  | ||||
|  | ||||
|     urlpatterns = patterns('', | ||||
|         ('^myview/$', 'mysite.myapp.views.myview') | ||||
|     ) | ||||
|      | ||||
|  | ||||
| can now be rewritten as:: | ||||
|  | ||||
|     from django.conf.urls.defaults import * | ||||
|     from mysite.myapp.views import myview | ||||
|      | ||||
|     urlpatterns = patterns('',  | ||||
|  | ||||
|     urlpatterns = patterns('', | ||||
|         ('^myview/$', myview) | ||||
|     ) | ||||
|          | ||||
|  | ||||
| One useful application of this can be seen when using decorators; this | ||||
| change allows you to apply decorators to views *in your | ||||
| URLconf*. Thus, you can make a generic view require login very | ||||
| @@ -202,17 +202,17 @@ easily:: | ||||
|     from django.contrib.auth.decorators import login_required | ||||
|     from django.views.generic.list_detail import object_list | ||||
|     from mysite.myapp.models import MyModel | ||||
|      | ||||
|  | ||||
|     info = { | ||||
|         "queryset" : MyModel.objects.all(), | ||||
|     } | ||||
|      | ||||
|     urlpatterns = patterns('',  | ||||
|  | ||||
|     urlpatterns = patterns('', | ||||
|         ('^myview/$', login_required(object_list), info) | ||||
|     ) | ||||
|  | ||||
| Note that both syntaxes (strings and callables) are valid, and will continue to | ||||
| be valid for the foreseeable future.   | ||||
| be valid for the foreseeable future. | ||||
|  | ||||
| The test framework | ||||
| ------------------ | ||||
| @@ -248,19 +248,19 @@ all their hard work: | ||||
|  | ||||
|     * Russell Keith-Magee and Malcolm Tredinnick for their major code | ||||
|       contributions. This release wouldn't have been possible without them. | ||||
|        | ||||
|  | ||||
|     * Our new release manager, James Bennett, for his work in getting out | ||||
|       0.95.1, 0.96, and (hopefully) future release. | ||||
|        | ||||
|  | ||||
|     * Our ticket managers Chris Beaven (aka SmileyChris), Simon Greenhill, | ||||
|       Michael Radziej, and Gary Wilson. They agreed to take on the monumental | ||||
|       task of wrangling our tickets into nicely cataloged submission. Figuring | ||||
|       out what to work on is now about a million times easier; thanks again, | ||||
|       guys. | ||||
|              | ||||
|  | ||||
|     * Everyone who submitted a bug report, patch or ticket comment. We can't | ||||
|       possibly thank everyone by name -- over 200 developers submitted patches | ||||
|       that went into 0.96 -- but everyone who's contributed to Django is listed | ||||
|       in AUTHORS_. | ||||
|        | ||||
|  | ||||
| .. _AUTHORS: http://code.djangoproject.com/browser/django/trunk/AUTHORS | ||||
|   | ||||
| @@ -67,6 +67,72 @@ changes: | ||||
|  | ||||
|        __members__ = property(lambda self: self.__dir__()) | ||||
|  | ||||
| Specifying databases | ||||
| -------------------- | ||||
|  | ||||
| Prior to Django 1.1, Django used a number of settings to control access to a | ||||
| single database. Django 1.2 introduces support for multiple databases, and as | ||||
| a result, the way you define database settings has changed. | ||||
|  | ||||
| Previously, there were a number of ``DATABASE_`` settings at the top level of | ||||
| your settings file. For example:: | ||||
|  | ||||
|     DATABASE_NAME = 'test_db' | ||||
|     DATABASE_BACKEND = 'postgresl_psycopg2' | ||||
|     DATABASE_USER = 'myusername' | ||||
|     DATABASE_PASSWORD = 's3krit' | ||||
|  | ||||
| These settings are now contained inside a dictionary named | ||||
| ``DATABASES``. Each item in the dictionary corresponds to a single | ||||
| database connection, with the name ``default`` describing the default | ||||
| database connection. The setting names have also been shortened to | ||||
| reflect the fact that they are stored in a dictionary. The sample | ||||
| settings given previously would now be stored using:: | ||||
|  | ||||
|     DATABASES = { | ||||
|         'default': { | ||||
|             'NAME': 'test_db', | ||||
|             'BACKEND': 'django.db.backends.postgresl_psycopg2', | ||||
|             'USER': 'myusername', | ||||
|             'PASSWORD': 's3krit', | ||||
|     } | ||||
|  | ||||
| This affects the following settings: | ||||
|  | ||||
|     Old setting                                New Setting | ||||
|     =========================================  =========== | ||||
|     :setting:`DATABASE_ENGINE`                 ENGINE | ||||
|     :setting:`DATABASE_HOST`                   HOST | ||||
|     :setting:`DATABASE_NAME`                   NAME | ||||
|     :setting:`DATABASE_OPTIONS`                OPTIONS | ||||
|     :setting:`DATABASE_PASSWORD`               PASSWORD | ||||
|     :setting:`DATABASE_PORT`                   PORT | ||||
|     :setting:`DATABASE_USER`                   USER | ||||
|     :setting:`TEST_DATABASE_CHARSET`           TEST_CHARSET | ||||
|     :setting:`TEST_DATABASE_COLLATION`         TEST_COLLATION | ||||
|     :setting:`TEST_DATABASE_NAME`              TEST_NAME | ||||
|  | ||||
| These changes are also required if you have manually created a database | ||||
| connection using | ||||
|  | ||||
| In addition to the change in structure, Django 1.2 removes the special | ||||
| handling for the built-in database backends. All database backends | ||||
| must now be specified by a fully qualified class name (i.e., | ||||
| ``django.db.backends.postgresl_psycopg2``, rather than just | ||||
| ``postgresql_psycopg2``) | ||||
|  | ||||
| ``__dict__`` on Model instances | ||||
| ------------------------------- | ||||
|  | ||||
| Historically, the ``__dict__`` attribute of a model instance has only contained | ||||
| attributes corresponding to the fields on a model. | ||||
|  | ||||
| In order to support multiple database configurations, Django 1.2 has | ||||
| added a ``_state`` attribute to object instances. This attribute will | ||||
| appear in ``__dict__`` for a model instance. If your code relies on | ||||
| iterating over __dict__ to obtain a list of fields, you must now | ||||
| filter out ``_state`` attribute of out ``__dict__``. | ||||
|  | ||||
| .. _deprecated-features-1.2: | ||||
|  | ||||
| Features deprecated in 1.2 | ||||
| @@ -107,3 +173,12 @@ backend implementations that allow you to send email to a | ||||
| :ref:`memory<topic-email-memory-backend>` - you can even configure all | ||||
| email to be :ref:`thrown away<topic-email-console-backend>`. | ||||
|  | ||||
| Support for multiple databases | ||||
| ------------------------------ | ||||
|  | ||||
| Django 1.2 adds the ability to use :ref:`more than one database | ||||
| <topics-db-multi-db>`in your Django project. Queries can be | ||||
| issued at a specific database with the `using()` method on | ||||
| querysets; individual objects can be saved to a specific database | ||||
| by providing a ``using`` argument when you save the instance. | ||||
|  | ||||
|   | ||||
| @@ -278,33 +278,35 @@ The test database | ||||
| ----------------- | ||||
|  | ||||
| Tests that require a database (namely, model tests) will not use your "real" | ||||
| (production) database. A separate, blank database is created for the tests. | ||||
| (production) database. Separate, blank databases are created for the tests. | ||||
|  | ||||
| Regardless of whether the tests pass or fail, the test database is destroyed | ||||
| Regardless of whether the tests pass or fail, the test databases are destroyed | ||||
| when all the tests have been executed. | ||||
|  | ||||
| By default this test database gets its name by prepending ``test_`` to the | ||||
| value of the ``DATABASE_NAME`` setting. When using the SQLite database | ||||
| engine the tests will by default use an in-memory database (i.e., the database | ||||
| will be created in memory, bypassing the filesystem entirely!). If you want to | ||||
| use a different database name, specify ``TEST_DATABASE_NAME`` in the dictionary | ||||
| for any given database in :setting:`DATABASES`. | ||||
| By default the test databases get their names by prepending ``test_`` | ||||
| to the value of the :setting:`NAME`` settings for the databased | ||||
| defined in :setting:`DATABASES`. When using the SQLite database engine | ||||
| the tests will by default use an in-memory database (i.e., the | ||||
| database will be created in memory, bypassing the filesystem | ||||
| entirely!). If you want to use a different database name, specify | ||||
| ``TEST_NAME`` in the dictionary for any given database in | ||||
| :setting:`DATABASES`. | ||||
|  | ||||
| Aside from using a separate database, the test runner will otherwise use all of | ||||
| the same database settings you have in your settings file: | ||||
| ``DATABASE_ENGINE``, ``DATABASE_USER``, ``DATABASE_HOST``, | ||||
| etc. The test database is created by the user specified by | ||||
| ``DATABASE_USER``, so you'll need to make sure that the given user | ||||
| account has sufficient privileges to create a new database on the system. | ||||
| Aside from using a separate database, the test runner will otherwise | ||||
| use all of the same database settings you have in your settings file: | ||||
| :setting:`ENGINE`, :setting:`USER`, :setting:`HOST`, etc. The test | ||||
| database is created by the user specified by ``USER``, so you'll need | ||||
| to make sure that the given user account has sufficient privileges to | ||||
| create a new database on the system. | ||||
|  | ||||
| .. versionadded:: 1.0 | ||||
|  | ||||
| For fine-grained control over the | ||||
| character encoding of your test database, use the | ||||
| ``TEST_DATABASE_CHARSET`` option. If you're using MySQL, you can also | ||||
| use the ``TEST_DATABASE_COLLATION`` option to control the particular | ||||
| collation used by the test database. See the :ref:`settings documentation | ||||
| <ref-settings>` for details of these advanced settings. | ||||
| For fine-grained control over the character encoding of your test | ||||
| database, use the :setting:`TEST_CHARSET` option. If you're using | ||||
| MySQL, you can also use the :setting:`TEST_COLLATION` option to | ||||
| control the particular collation used by the test database. See the | ||||
| :ref:`settings documentation <ref-settings>` for details of these | ||||
| advanced settings. | ||||
|  | ||||
| Other test conditions | ||||
| --------------------- | ||||
| @@ -1284,16 +1286,17 @@ utility methods in the ``django.test.utils`` module. | ||||
| .. function:: setup_test_environment() | ||||
|  | ||||
|     Performs any global pre-test setup, such as the installing the | ||||
|     instrumentation of the template rendering system and setting up the dummy | ||||
|     ``SMTPConnection``. | ||||
|     instrumentation of the template rendering system and setting up | ||||
|     the dummy ``SMTPConnection``. | ||||
|  | ||||
| .. function:: teardown_test_environment() | ||||
|  | ||||
|     Performs any global post-test teardown, such as removing the black magic | ||||
|     hooks into the template system and restoring normal e-mail services. | ||||
|     Performs any global post-test teardown, such as removing the black | ||||
|     magic hooks into the template system and restoring normal e-mail | ||||
|     services. | ||||
|  | ||||
| The creation module of the database backend (``connection.creation``) also | ||||
| provides some utilities that can be useful during testing. | ||||
| The creation module of the database backend (``connection.creation``) | ||||
| also provides some utilities that can be useful during testing. | ||||
|  | ||||
| .. function:: create_test_db(verbosity=1, autoclobber=False) | ||||
|  | ||||
| @@ -1301,27 +1304,29 @@ provides some utilities that can be useful during testing. | ||||
|  | ||||
|     ``verbosity`` has the same behavior as in ``run_tests()``. | ||||
|  | ||||
|     ``autoclobber`` describes the behavior that will occur if a database with | ||||
|     the same name as the test database is discovered: | ||||
|     ``autoclobber`` describes the behavior that will occur if a | ||||
|     database with the same name as the test database is discovered: | ||||
|  | ||||
|         * If ``autoclobber`` is ``False``, the user will be asked to approve | ||||
|           destroying the existing database. ``sys.exit`` is called if the user | ||||
|           does not approve. | ||||
|         * If ``autoclobber`` is ``False``, the user will be asked to | ||||
|           approve destroying the existing database. ``sys.exit`` is | ||||
|           called if the user does not approve. | ||||
|  | ||||
|         * If autoclobber is ``True``, the database will be destroyed without | ||||
|           consulting the user. | ||||
|         * If autoclobber is ``True``, the database will be destroyed | ||||
|           without consulting the user. | ||||
|  | ||||
|     Returns the name of the test database that it created. | ||||
|  | ||||
|     ``create_test_db()`` has the side effect of modifying | ||||
|     ``settings.DATABASE_NAME`` to match the name of the test database. | ||||
|     ``create_test_db()`` has the side effect of modifying the value of | ||||
|     :setting:`NAME` in :setting:`DATABASES` to match the name of the test | ||||
|     database. | ||||
|  | ||||
|     .. versionchanged:: 1.0 | ||||
|        ``create_test_db()`` now returns the name of the test database. | ||||
|  | ||||
| .. function:: destroy_test_db(old_database_name, verbosity=1) | ||||
|  | ||||
|     Destroys the database whose name is in the :setting:`DATABASE_NAME` setting | ||||
|     and restores the value of :setting:`DATABASE_NAME` to the provided name. | ||||
|     Destroys the database whose name is in stored in :setting:`NAME` in the | ||||
|     :setting:`DATABASES`, and sets :setting:`NAME` to use the | ||||
|     provided name. | ||||
|  | ||||
|     ``verbosity`` has the same behavior as in ``run_tests()``. | ||||
|   | ||||
| @@ -365,7 +365,7 @@ from django.conf import settings | ||||
|  | ||||
| building_docs = getattr(settings, 'BUILDING_DOCS', False) | ||||
|  | ||||
| if building_docs or settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == 'postgresql': | ||||
| if building_docs or settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] == 'django.db.backends.postgresql': | ||||
|     __test__['API_TESTS'] += """ | ||||
| # In PostgreSQL, microsecond-level precision is available. | ||||
| >>> a9 = Article(headline='Article 9', pub_date=datetime(2005, 7, 31, 12, 30, 45, 180)) | ||||
| @@ -374,7 +374,7 @@ if building_docs or settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == ' | ||||
| datetime.datetime(2005, 7, 31, 12, 30, 45, 180) | ||||
| """ | ||||
|  | ||||
| if building_docs or settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == 'mysql': | ||||
| if building_docs or settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] == 'django.db.backends.mysql': | ||||
|     __test__['API_TESTS'] += """ | ||||
| # In MySQL, microsecond-level precision isn't available. You'll lose | ||||
| # microsecond-level precision once the data is saved. | ||||
|   | ||||
| @@ -156,7 +156,7 @@ True | ||||
| # SQLite lets objects be saved with an empty primary key, even though an | ||||
| # integer is expected. So we can't check for an error being raised in that case | ||||
| # for SQLite. Remove it from the suite for this next bit. | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] != 'sqlite3': | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] != 'django.db.backends.sqlite3': | ||||
|     __test__["API_TESTS"] += """ | ||||
| # The primary key must be specified, so an error is raised if you try to create | ||||
| # an object without it. | ||||
|   | ||||
| @@ -100,7 +100,7 @@ __test__ = {'API_TESTS': """ | ||||
|  | ||||
| # Database flushing does not work on MySQL with the default storage engine | ||||
| # because it requires transaction support. | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] != 'mysql': | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] != 'django.db.backends.mysql': | ||||
|     __test__['API_TESTS'] += \ | ||||
| """ | ||||
| # Reset the database representation of this app. This will delete all data. | ||||
|   | ||||
| @@ -43,7 +43,9 @@ False | ||||
| True | ||||
| """} | ||||
|  | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] in ('postgresql', 'postgresql_pysycopg2'): | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] in ( | ||||
|         'django.db.backends.postgresql', | ||||
|         'django.db.backends.postgresql_pysycopg2'): | ||||
|     __test__['API_TESTS'] += r""" | ||||
| # text matching tests for PostgreSQL 8.3 | ||||
| >>> Article.objects.filter(id__iexact='1') | ||||
| @@ -399,7 +401,7 @@ FieldError: Join on field 'headline' not permitted. Did you misspell 'starts' fo | ||||
| """ | ||||
|  | ||||
|  | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] != 'mysql': | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] != 'django.db.backends.mysql': | ||||
|     __test__['API_TESTS'] += r""" | ||||
| # grouping and backreferences | ||||
| >>> Article.objects.filter(headline__regex=r'b(.).*b\1') | ||||
|   | ||||
| @@ -28,7 +28,7 @@ from django.conf import settings | ||||
|  | ||||
| building_docs = getattr(settings, 'BUILDING_DOCS', False) | ||||
|  | ||||
| if building_docs or settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] != 'mysql': | ||||
| if building_docs or settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] != 'django.db.backends.mysql': | ||||
|     __test__['API_TESTS'] += """ | ||||
| # the default behavior is to autocommit after each save() action | ||||
| >>> def create_a_reporter_then_fail(first, last): | ||||
|   | ||||
| @@ -61,23 +61,25 @@ class AdminScriptTestCase(unittest.TestCase): | ||||
|         except OSError: | ||||
|             pass | ||||
|  | ||||
|     def _ext_backend_path(self): | ||||
|     def _ext_backend_paths(self): | ||||
|         """ | ||||
|         Returns the path for the external backend package, or None if no | ||||
|         external backend is detected. | ||||
|         Returns the paths for any external backend packages. | ||||
|         """ | ||||
|         paths = [] | ||||
|         first_package_re = re.compile(r'(^[^\.]+)\.') | ||||
|         result = first_package_re.findall(settings.DATABASE_ENGINE) | ||||
|         if result: | ||||
|             backend_pkg = __import__(result[0]) | ||||
|             backend_dir = os.path.dirname(backend_pkg.__file__) | ||||
|             return os.path.dirname(backend_dir) | ||||
|         for backend in settings.DATABASES.values(): | ||||
|             result = first_package_re.findall(backend['ENGINE']) | ||||
|             if result and result != 'django': | ||||
|                 backend_pkg = __import__(result[0]) | ||||
|                 backend_dir = os.path.dirname(backend_pkg.__file__) | ||||
|                 paths.append(os.path.dirname(backend_dir)) | ||||
|         return paths | ||||
|  | ||||
|     def run_test(self, script, args, settings_file=None, apps=None): | ||||
|         test_dir = os.path.dirname(os.path.dirname(__file__)) | ||||
|         project_dir = os.path.dirname(test_dir) | ||||
|         base_dir = os.path.dirname(project_dir) | ||||
|         ext_backend_base_dir = self._ext_backend_path() | ||||
|         ext_backend_base_dirs = self._ext_backend_paths() | ||||
|  | ||||
|         # Remember the old environment | ||||
|         old_django_settings_module = os.environ.get('DJANGO_SETTINGS_MODULE', None) | ||||
| @@ -95,8 +97,7 @@ class AdminScriptTestCase(unittest.TestCase): | ||||
|         elif 'DJANGO_SETTINGS_MODULE' in os.environ: | ||||
|             del os.environ['DJANGO_SETTINGS_MODULE'] | ||||
|         python_path = [test_dir, base_dir] | ||||
|         if ext_backend_base_dir: | ||||
|             python_path.append(ext_backend_base_dir) | ||||
|         python_path.extend(ext_backend_base_dirs) | ||||
|         os.environ[python_path_var_name] = os.pathsep.join(python_path) | ||||
|  | ||||
|         # Build the command line | ||||
|   | ||||
| @@ -327,7 +327,7 @@ def run_stddev_tests(): | ||||
|     Stddev and Variance are not guaranteed to be available for SQLite, and | ||||
|     are not available for PostgreSQL before 8.2. | ||||
|     """ | ||||
|     if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == 'sqlite3': | ||||
|     if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] == 'django.db.backends.sqlite3': | ||||
|         return False | ||||
|  | ||||
|     class StdDevPop(object): | ||||
|   | ||||
| @@ -10,7 +10,7 @@ class Callproc(unittest.TestCase): | ||||
|     def test_dbms_session(self): | ||||
|         # If the backend is Oracle, test that we can call a standard | ||||
|         # stored procedure through our cursor wrapper. | ||||
|         if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == 'oracle': | ||||
|         if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] == 'django.db.backends.oracle': | ||||
|             convert_unicode = backend.convert_unicode | ||||
|             cursor = connection.cursor() | ||||
|             cursor.callproc(convert_unicode('DBMS_SESSION.SET_IDENTIFIER'), | ||||
| @@ -39,7 +39,7 @@ class LongString(unittest.TestCase): | ||||
|     def test_long_string(self): | ||||
|         # If the backend is Oracle, test that we can save a text longer | ||||
|         # than 4000 chars and read it properly | ||||
|         if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == 'oracle': | ||||
|         if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] == 'django.db.backends.oracle': | ||||
|             c = connection.cursor() | ||||
|             c.execute('CREATE TABLE ltext ("TEXT" NCLOB)') | ||||
|             long_str = ''.join([unicode(x) for x in xrange(4000)]) | ||||
| @@ -79,7 +79,7 @@ __test__ = {'API_TESTS': """ | ||||
| # Unfortunately with sqlite3 the in-memory test database cannot be | ||||
| # closed, and so it cannot be re-opened during testing, and so we | ||||
| # sadly disable this test for now. | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] != 'sqlite3': | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] != 'django.db.backends.sqlite3': | ||||
|     __test__['API_TESTS'] += """ | ||||
| >>> connection_created.connect(connection_created_test) | ||||
| >>> connection.close() # Ensure the connection is closed | ||||
|   | ||||
| @@ -93,7 +93,7 @@ u'Outstanding' | ||||
|  | ||||
| # Regression test for #8354: the MySQL backend should raise an error if given | ||||
| # a timezone-aware datetime object. | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == 'mysql': | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] == 'django.db.backends.mysql': | ||||
|     __test__['API_TESTS'] += """ | ||||
| >>> from django.utils import tzinfo | ||||
| >>> dt = datetime.datetime(2008, 8, 31, 16, 20, tzinfo=tzinfo.FixedOffset(0)) | ||||
|   | ||||
| @@ -8,18 +8,18 @@ class Book(models.Model): | ||||
|  | ||||
| # Can't run this test under SQLite, because you can't | ||||
| # get two connections to an in-memory database. | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] != 'sqlite3': | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] != 'django.db.backends.sqlite3': | ||||
|     class DeleteLockingTest(TransactionTestCase): | ||||
|         def setUp(self): | ||||
|             # Create a second connection to the database | ||||
|             conn_settings = settings.DATABASES[DEFAULT_DB_ALIAS] | ||||
|             self.conn2 = backend.DatabaseWrapper({ | ||||
|                 'DATABASE_HOST': conn_settings['DATABASE_HOST'], | ||||
|                 'DATABASE_NAME': conn_settings['DATABASE_NAME'], | ||||
|                 'DATABASE_OPTIONS': conn_settings['DATABASE_OPTIONS'], | ||||
|                 'DATABASE_PASSWORD': conn_settings['DATABASE_PASSWORD'], | ||||
|                 'DATABASE_PORT': conn_settings['DATABASE_PORT'], | ||||
|                 'DATABASE_USER': conn_settings['DATABASE_USER'], | ||||
|                 'HOST': conn_settings['HOST'], | ||||
|                 'NAME': conn_settings['NAME'], | ||||
|                 'OPTIONS': conn_settings['OPTIONS'], | ||||
|                 'PASSWORD': conn_settings['PASSWORD'], | ||||
|                 'PORT': conn_settings['PORT'], | ||||
|                 'USER': conn_settings['USER'], | ||||
|                 'TIME_ZONE': settings.TIME_ZONE, | ||||
|             }) | ||||
|  | ||||
|   | ||||
| @@ -121,7 +121,7 @@ Complex expressions of different connection types are possible. | ||||
| """} | ||||
|  | ||||
| # Oracle doesn't support the Bitwise OR operator. | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] != 'oracle': | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] != 'django.db.backends.oracle': | ||||
|     __test__['API_TESTS'] += """ | ||||
|  | ||||
| >>> _ = Number.objects.filter(pk=n.pk).update(integer=42, float=15.5) | ||||
|   | ||||
| @@ -35,7 +35,7 @@ class Stuff(models.Model): | ||||
|         # Oracle doesn't distinguish between None and the empty string. | ||||
|         # This hack makes the test case pass using Oracle. | ||||
|         name = self.name | ||||
|         if (settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == 'oracle' | ||||
|         if (settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] == 'django.db.backends.oracle' | ||||
|             and name == u''): | ||||
|             name = None | ||||
|         return unicode(name) + u' is owned by ' + unicode(self.owner) | ||||
|   | ||||
| @@ -80,7 +80,7 @@ class IntrospectionTests(TestCase): | ||||
|                           ['IntegerField', 'CharField', 'CharField', 'CharField']) | ||||
|  | ||||
|     # Regression test for #9991 - 'real' types in postgres | ||||
|     if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'].startswith('postgresql'): | ||||
|     if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'].startswith('django.db.backends.postgresql'): | ||||
|         def test_postgresql_real_type(self): | ||||
|             cursor = connection.cursor() | ||||
|             cursor.execute("CREATE TABLE django_ixn_real_test_table (number REAL);") | ||||
|   | ||||
| @@ -149,7 +149,9 @@ datetime.datetime(2000, 1, 1, 6, 1, 1) | ||||
|  | ||||
| """} | ||||
|  | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] not in ("mysql", "oracle"): | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] not in ( | ||||
|         "django.db.backends.mysql", | ||||
|         "django.db.backends.oracle"): | ||||
|     __test__["timezone-tests"] = """ | ||||
| # Saving an updating with timezone-aware datetime Python objects. Regression | ||||
| # test for #10443. | ||||
|   | ||||
| @@ -1223,13 +1223,13 @@ FieldError: Infinite loop caused by ordering. | ||||
|  | ||||
|  | ||||
| # In Oracle, we expect a null CharField to return u'' instead of None. | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == "oracle": | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] == "django.db.backends.oracle": | ||||
|     __test__["API_TESTS"] = __test__["API_TESTS"].replace("<NONE_OR_EMPTY_UNICODE>", "u''") | ||||
| else: | ||||
|     __test__["API_TESTS"] = __test__["API_TESTS"].replace("<NONE_OR_EMPTY_UNICODE>", "None") | ||||
|  | ||||
|  | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == "mysql": | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] == "django.db.backends.mysql": | ||||
|     __test__["API_TESTS"] += """ | ||||
| When grouping without specifying ordering, we add an explicit "ORDER BY NULL" | ||||
| portion in MySQL to prevent unnecessary sorting. | ||||
|   | ||||
| @@ -326,7 +326,7 @@ The end."""), | ||||
| # Because Oracle treats the empty string as NULL, Oracle is expected to fail | ||||
| # when field.empty_strings_allowed is True and the value is None; skip these | ||||
| # tests. | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == 'oracle': | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] == 'django.db.backends.oracle': | ||||
|     test_data = [data for data in test_data | ||||
|                  if not (data[0] == data_obj and | ||||
|                          data[2]._meta.get_field('data').empty_strings_allowed and | ||||
| @@ -335,7 +335,7 @@ if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] == 'oracle': | ||||
| # Regression test for #8651 -- a FK to an object iwth PK of 0 | ||||
| # This won't work on MySQL since it won't let you create an object | ||||
| # with a primary key of 0, | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['DATABASE_ENGINE'] != 'mysql': | ||||
| if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] != 'django.db.backends.mysql': | ||||
|     test_data.extend([ | ||||
|         (data_obj, 0, Anchor, "Anchor 0"), | ||||
|         (fk_obj, 465, FKData, 0), | ||||
|   | ||||
| @@ -89,7 +89,6 @@ def django_tests(verbosity, interactive, test_labels): | ||||
|     from django.conf import settings | ||||
|  | ||||
|     old_installed_apps = settings.INSTALLED_APPS | ||||
|     old_test_database_name = settings.TEST_DATABASE_NAME | ||||
|     old_root_urlconf = getattr(settings, "ROOT_URLCONF", "") | ||||
|     old_template_dirs = settings.TEMPLATE_DIRS | ||||
|     old_use_i18n = settings.USE_I18N | ||||
|   | ||||
		Reference in New Issue
	
	Block a user