Loading django/db/__init__.py +15 −7 Original line number Diff line number Diff line import warnings from django.core import signals from django.db.utils import (DEFAULT_DB_ALIAS, DataError, OperationalError, IntegrityError, InternalError, ProgrammingError, NotSupportedError, DatabaseError, InterfaceError, Error, load_backend, ConnectionHandler, ConnectionRouter) from django.db.utils import (DEFAULT_DB_ALIAS, DataError, OperationalError, IntegrityError, InternalError, ProgrammingError, NotSupportedError, DatabaseError, InterfaceError, Error, load_backend, ConnectionHandler, ConnectionRouter) from django.utils.functional import cached_property __all__ = ('backend', 'connection', 'connections', 'router', 'DatabaseError', 'IntegrityError', 'DEFAULT_DB_ALIAS') __all__ = [ 'backend', 'connection', 'connections', 'router', 'DatabaseError', 'IntegrityError', 'InternalError', 'ProgrammingError', 'DataError', 'NotSupportedError', 'Error', 'InterfaceError', 'OperationalError', 'DEFAULT_DB_ALIAS' ] connections = ConnectionHandler() router = ConnectionRouter() # `connection`, `DatabaseError` and `IntegrityError` are convenient aliases # for backend bits. Loading Loading @@ -70,6 +75,7 @@ class DefaultBackendProxy(object): backend = DefaultBackendProxy() def close_connection(**kwargs): warnings.warn( "close_connection is superseded by close_old_connections.", Loading @@ -83,12 +89,14 @@ def close_connection(**kwargs): transaction.abort(conn) connections[conn].close() # Register an event to reset saved queries when a Django request is started. def reset_queries(**kwargs): for conn in connections.all(): conn.queries = [] signals.request_started.connect(reset_queries) # Register an event to reset transaction state and close connections past # their lifetime. NB: abort() doesn't do anything outside of a transaction. def close_old_connections(**kwargs): Loading django/db/backends/__init__.py +1 −0 Original line number Diff line number Diff line Loading @@ -1167,6 +1167,7 @@ FieldInfo = namedtuple('FieldInfo', 'name type_code display_size internal_size precision scale null_ok' ) class BaseDatabaseIntrospection(object): """ This class encapsulates all backend-specific introspection utilities Loading django/db/backends/creation.py +4 −3 Original line number Diff line number Diff line Loading @@ -251,12 +251,13 @@ class BaseDatabaseCreation(object): r_col = model._meta.get_field(f.rel.field_name).column r_name = '%s_refs_%s_%s' % ( col, r_col, self._digest(table, r_table)) output.append('%s %s %s %s;' % \ (style.SQL_KEYWORD('ALTER TABLE'), output.append('%s %s %s %s;' % ( style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(table)), style.SQL_KEYWORD(self.connection.ops.drop_foreignkey_sql()), style.SQL_FIELD(qn(truncate_name( r_name, self.connection.ops.max_name_length()))))) r_name, self.connection.ops.max_name_length()))) )) del references_to_delete[model] return output Loading django/db/backends/dummy/base.py +12 −1 Original line number Diff line number Diff line Loading @@ -8,33 +8,43 @@ ImproperlyConfigured. """ from django.core.exceptions import ImproperlyConfigured from django.db.backends import * from django.db.backends import (BaseDatabaseOperations, BaseDatabaseClient, BaseDatabaseIntrospection, BaseDatabaseWrapper, BaseDatabaseFeatures, BaseDatabaseValidation) from django.db.backends.creation import BaseDatabaseCreation def complain(*args, **kwargs): raise ImproperlyConfigured("settings.DATABASES is improperly configured. " "Please supply the ENGINE value. Check " "settings documentation for more details.") def ignore(*args, **kwargs): pass class DatabaseError(Exception): pass class IntegrityError(DatabaseError): pass class DatabaseOperations(BaseDatabaseOperations): quote_name = complain class DatabaseClient(BaseDatabaseClient): runshell = complain class DatabaseCreation(BaseDatabaseCreation): create_test_db = ignore destroy_test_db = ignore class DatabaseIntrospection(BaseDatabaseIntrospection): get_table_list = complain get_table_description = complain Loading @@ -42,6 +52,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): get_indexes = complain get_key_columns = complain class DatabaseWrapper(BaseDatabaseWrapper): operators = {} # Override the base class implementations with null Loading django/db/backends/mysql/base.py +10 −3 Original line number Diff line number Diff line Loading @@ -36,8 +36,9 @@ except ImportError: pytz = None from django.conf import settings from django.db import utils from django.db.backends import * from django.db import (utils, BaseDatabaseFeatures, BaseDatabaseOperations, BaseDatabaseWrapper) from django.db.backends import util from django.db.backends.mysql.client import DatabaseClient from django.db.backends.mysql.creation import DatabaseCreation from django.db.backends.mysql.introspection import DatabaseIntrospection Loading @@ -57,6 +58,7 @@ IntegrityError = Database.IntegrityError # It's impossible to import datetime_or_None directly from MySQLdb.times parse_datetime = conversions[FIELD_TYPE.DATETIME] def parse_datetime_with_timezone_support(value): dt = parse_datetime(value) # Confirm that dt is naive before overwriting its tzinfo. Loading @@ -64,6 +66,7 @@ def parse_datetime_with_timezone_support(value): dt = dt.replace(tzinfo=timezone.utc) return dt def adapt_datetime_with_timezone_support(value, conv): # Equivalent to DateTimeField.get_db_prep_value. Used only by raw SQL. if settings.USE_TZ: Loading Loading @@ -98,6 +101,7 @@ django_conversions.update({ # http://dev.mysql.com/doc/refman/5.0/en/news.html . server_version_re = re.compile(r'(\d{1,2})\.(\d{1,2})\.(\d{1,2})') # MySQLdb-1.2.1 and newer automatically makes use of SHOW WARNINGS on # MySQL-4.1 and newer, so the MysqlDebugWrapper is unnecessary. Since the # point is to raise Warnings as exceptions, this can be done with the Python Loading Loading @@ -148,6 +152,7 @@ class CursorWrapper(object): def __iter__(self): return iter(self.cursor) class DatabaseFeatures(BaseDatabaseFeatures): empty_fetchmany_value = () update_can_self_select = False Loading Loading @@ -204,6 +209,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): cursor.execute("SELECT 1 FROM mysql.time_zone LIMIT 1") return cursor.fetchone() is not None class DatabaseOperations(BaseDatabaseOperations): compiler_module = "django.db.backends.mysql.compiler" Loading Loading @@ -319,7 +325,7 @@ class DatabaseOperations(BaseDatabaseOperations): # Truncate already resets the AUTO_INCREMENT field from # MySQL version 5.0.13 onwards. Refs #16961. if self.connection.mysql_version < (5, 0, 13): return ["%s %s %s %s %s;" % \ return ["%s %s %s %s %s;" % (style.SQL_KEYWORD('ALTER'), style.SQL_KEYWORD('TABLE'), style.SQL_TABLE(self.quote_name(sequence['table'])), Loading Loading @@ -373,6 +379,7 @@ class DatabaseOperations(BaseDatabaseOperations): items_sql = "(%s)" % ", ".join(["%s"] * len(fields)) return "VALUES " + ", ".join([items_sql] * num_values) class DatabaseWrapper(BaseDatabaseWrapper): vendor = 'mysql' operators = { Loading Loading
django/db/__init__.py +15 −7 Original line number Diff line number Diff line import warnings from django.core import signals from django.db.utils import (DEFAULT_DB_ALIAS, DataError, OperationalError, IntegrityError, InternalError, ProgrammingError, NotSupportedError, DatabaseError, InterfaceError, Error, load_backend, ConnectionHandler, ConnectionRouter) from django.db.utils import (DEFAULT_DB_ALIAS, DataError, OperationalError, IntegrityError, InternalError, ProgrammingError, NotSupportedError, DatabaseError, InterfaceError, Error, load_backend, ConnectionHandler, ConnectionRouter) from django.utils.functional import cached_property __all__ = ('backend', 'connection', 'connections', 'router', 'DatabaseError', 'IntegrityError', 'DEFAULT_DB_ALIAS') __all__ = [ 'backend', 'connection', 'connections', 'router', 'DatabaseError', 'IntegrityError', 'InternalError', 'ProgrammingError', 'DataError', 'NotSupportedError', 'Error', 'InterfaceError', 'OperationalError', 'DEFAULT_DB_ALIAS' ] connections = ConnectionHandler() router = ConnectionRouter() # `connection`, `DatabaseError` and `IntegrityError` are convenient aliases # for backend bits. Loading Loading @@ -70,6 +75,7 @@ class DefaultBackendProxy(object): backend = DefaultBackendProxy() def close_connection(**kwargs): warnings.warn( "close_connection is superseded by close_old_connections.", Loading @@ -83,12 +89,14 @@ def close_connection(**kwargs): transaction.abort(conn) connections[conn].close() # Register an event to reset saved queries when a Django request is started. def reset_queries(**kwargs): for conn in connections.all(): conn.queries = [] signals.request_started.connect(reset_queries) # Register an event to reset transaction state and close connections past # their lifetime. NB: abort() doesn't do anything outside of a transaction. def close_old_connections(**kwargs): Loading
django/db/backends/__init__.py +1 −0 Original line number Diff line number Diff line Loading @@ -1167,6 +1167,7 @@ FieldInfo = namedtuple('FieldInfo', 'name type_code display_size internal_size precision scale null_ok' ) class BaseDatabaseIntrospection(object): """ This class encapsulates all backend-specific introspection utilities Loading
django/db/backends/creation.py +4 −3 Original line number Diff line number Diff line Loading @@ -251,12 +251,13 @@ class BaseDatabaseCreation(object): r_col = model._meta.get_field(f.rel.field_name).column r_name = '%s_refs_%s_%s' % ( col, r_col, self._digest(table, r_table)) output.append('%s %s %s %s;' % \ (style.SQL_KEYWORD('ALTER TABLE'), output.append('%s %s %s %s;' % ( style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(table)), style.SQL_KEYWORD(self.connection.ops.drop_foreignkey_sql()), style.SQL_FIELD(qn(truncate_name( r_name, self.connection.ops.max_name_length()))))) r_name, self.connection.ops.max_name_length()))) )) del references_to_delete[model] return output Loading
django/db/backends/dummy/base.py +12 −1 Original line number Diff line number Diff line Loading @@ -8,33 +8,43 @@ ImproperlyConfigured. """ from django.core.exceptions import ImproperlyConfigured from django.db.backends import * from django.db.backends import (BaseDatabaseOperations, BaseDatabaseClient, BaseDatabaseIntrospection, BaseDatabaseWrapper, BaseDatabaseFeatures, BaseDatabaseValidation) from django.db.backends.creation import BaseDatabaseCreation def complain(*args, **kwargs): raise ImproperlyConfigured("settings.DATABASES is improperly configured. " "Please supply the ENGINE value. Check " "settings documentation for more details.") def ignore(*args, **kwargs): pass class DatabaseError(Exception): pass class IntegrityError(DatabaseError): pass class DatabaseOperations(BaseDatabaseOperations): quote_name = complain class DatabaseClient(BaseDatabaseClient): runshell = complain class DatabaseCreation(BaseDatabaseCreation): create_test_db = ignore destroy_test_db = ignore class DatabaseIntrospection(BaseDatabaseIntrospection): get_table_list = complain get_table_description = complain Loading @@ -42,6 +52,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): get_indexes = complain get_key_columns = complain class DatabaseWrapper(BaseDatabaseWrapper): operators = {} # Override the base class implementations with null Loading
django/db/backends/mysql/base.py +10 −3 Original line number Diff line number Diff line Loading @@ -36,8 +36,9 @@ except ImportError: pytz = None from django.conf import settings from django.db import utils from django.db.backends import * from django.db import (utils, BaseDatabaseFeatures, BaseDatabaseOperations, BaseDatabaseWrapper) from django.db.backends import util from django.db.backends.mysql.client import DatabaseClient from django.db.backends.mysql.creation import DatabaseCreation from django.db.backends.mysql.introspection import DatabaseIntrospection Loading @@ -57,6 +58,7 @@ IntegrityError = Database.IntegrityError # It's impossible to import datetime_or_None directly from MySQLdb.times parse_datetime = conversions[FIELD_TYPE.DATETIME] def parse_datetime_with_timezone_support(value): dt = parse_datetime(value) # Confirm that dt is naive before overwriting its tzinfo. Loading @@ -64,6 +66,7 @@ def parse_datetime_with_timezone_support(value): dt = dt.replace(tzinfo=timezone.utc) return dt def adapt_datetime_with_timezone_support(value, conv): # Equivalent to DateTimeField.get_db_prep_value. Used only by raw SQL. if settings.USE_TZ: Loading Loading @@ -98,6 +101,7 @@ django_conversions.update({ # http://dev.mysql.com/doc/refman/5.0/en/news.html . server_version_re = re.compile(r'(\d{1,2})\.(\d{1,2})\.(\d{1,2})') # MySQLdb-1.2.1 and newer automatically makes use of SHOW WARNINGS on # MySQL-4.1 and newer, so the MysqlDebugWrapper is unnecessary. Since the # point is to raise Warnings as exceptions, this can be done with the Python Loading Loading @@ -148,6 +152,7 @@ class CursorWrapper(object): def __iter__(self): return iter(self.cursor) class DatabaseFeatures(BaseDatabaseFeatures): empty_fetchmany_value = () update_can_self_select = False Loading Loading @@ -204,6 +209,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): cursor.execute("SELECT 1 FROM mysql.time_zone LIMIT 1") return cursor.fetchone() is not None class DatabaseOperations(BaseDatabaseOperations): compiler_module = "django.db.backends.mysql.compiler" Loading Loading @@ -319,7 +325,7 @@ class DatabaseOperations(BaseDatabaseOperations): # Truncate already resets the AUTO_INCREMENT field from # MySQL version 5.0.13 onwards. Refs #16961. if self.connection.mysql_version < (5, 0, 13): return ["%s %s %s %s %s;" % \ return ["%s %s %s %s %s;" % (style.SQL_KEYWORD('ALTER'), style.SQL_KEYWORD('TABLE'), style.SQL_TABLE(self.quote_name(sequence['table'])), Loading Loading @@ -373,6 +379,7 @@ class DatabaseOperations(BaseDatabaseOperations): items_sql = "(%s)" % ", ".join(["%s"] * len(fields)) return "VALUES " + ", ".join([items_sql] * num_values) class DatabaseWrapper(BaseDatabaseWrapper): vendor = 'mysql' operators = { Loading