/django/db/__init__.py

https://github.com/annina/b-counted · Python · 101 lines · 72 code · 13 blank · 16 comment · 14 complexity · 80130c3072152a5904fd8682b8d16b26 MD5 · raw file

  1. from django.conf import settings
  2. from django.core import signals
  3. from django.core.exceptions import ImproperlyConfigured
  4. from django.db.utils import ConnectionHandler, ConnectionRouter, load_backend, DEFAULT_DB_ALIAS, \
  5. DatabaseError, IntegrityError
  6. from django.utils.functional import curry
  7. __all__ = ('backend', 'connection', 'connections', 'router', 'DatabaseError',
  8. 'IntegrityError', 'DEFAULT_DB_ALIAS')
  9. # For backwards compatibility - Port any old database settings over to
  10. # the new values.
  11. if not settings.DATABASES:
  12. import warnings
  13. warnings.warn(
  14. "settings.DATABASE_* is deprecated; use settings.DATABASES instead.",
  15. PendingDeprecationWarning
  16. )
  17. settings.DATABASES[DEFAULT_DB_ALIAS] = {
  18. 'ENGINE': settings.DATABASE_ENGINE,
  19. 'HOST': settings.DATABASE_HOST,
  20. 'NAME': settings.DATABASE_NAME,
  21. 'OPTIONS': settings.DATABASE_OPTIONS,
  22. 'PASSWORD': settings.DATABASE_PASSWORD,
  23. 'PORT': settings.DATABASE_PORT,
  24. 'USER': settings.DATABASE_USER,
  25. 'TEST_CHARSET': settings.TEST_DATABASE_CHARSET,
  26. 'TEST_COLLATION': settings.TEST_DATABASE_COLLATION,
  27. 'TEST_NAME': settings.TEST_DATABASE_NAME,
  28. }
  29. if DEFAULT_DB_ALIAS not in settings.DATABASES:
  30. raise ImproperlyConfigured("You must default a '%s' database" % DEFAULT_DB_ALIAS)
  31. for alias, database in settings.DATABASES.items():
  32. if database['ENGINE'] in ("postgresql", "postgresql_psycopg2", "sqlite3", "mysql", "oracle"):
  33. import warnings
  34. if 'django.contrib.gis' in settings.INSTALLED_APPS:
  35. warnings.warn(
  36. "django.contrib.gis is now implemented as a full database backend. "
  37. "Modify ENGINE in the %s database configuration to select "
  38. "a backend from 'django.contrib.gis.db.backends'" % alias,
  39. PendingDeprecationWarning
  40. )
  41. if database['ENGINE'] == 'postgresql_psycopg2':
  42. full_engine = 'django.contrib.gis.db.backends.postgis'
  43. elif database['ENGINE'] == 'sqlite3':
  44. full_engine = 'django.contrib.gis.db.backends.spatialite'
  45. else:
  46. full_engine = 'django.contrib.gis.db.backends.%s' % database['ENGINE']
  47. else:
  48. warnings.warn(
  49. "Short names for ENGINE in database configurations are deprecated. "
  50. "Prepend %s.ENGINE with 'django.db.backends.'" % alias,
  51. PendingDeprecationWarning
  52. )
  53. full_engine = "django.db.backends.%s" % database['ENGINE']
  54. database['ENGINE'] = full_engine
  55. connections = ConnectionHandler(settings.DATABASES)
  56. router = ConnectionRouter(settings.DATABASE_ROUTERS)
  57. # `connection`, `DatabaseError` and `IntegrityError` are convenient aliases
  58. # for backend bits.
  59. # DatabaseWrapper.__init__() takes a dictionary, not a settings module, so
  60. # we manually create the dictionary from the settings, passing only the
  61. # settings that the database backends care about. Note that TIME_ZONE is used
  62. # by the PostgreSQL backends.
  63. # we load all these up for backwards compatibility, you should use
  64. # connections['default'] instead.
  65. connection = connections[DEFAULT_DB_ALIAS]
  66. backend = load_backend(connection.settings_dict['ENGINE'])
  67. # Register an event that closes the database connection
  68. # when a Django request is finished.
  69. def close_connection(**kwargs):
  70. for conn in connections.all():
  71. conn.close()
  72. signals.request_finished.connect(close_connection)
  73. # Register an event that resets connection.queries
  74. # when a Django request is started.
  75. def reset_queries(**kwargs):
  76. for conn in connections.all():
  77. conn.queries = []
  78. signals.request_started.connect(reset_queries)
  79. # Register an event that rolls back the connections
  80. # when a Django request has an exception.
  81. def _rollback_on_exception(**kwargs):
  82. from django.db import transaction
  83. for conn in connections:
  84. try:
  85. transaction.rollback_unless_managed(using=conn)
  86. except DatabaseError:
  87. pass
  88. signals.got_request_exception.connect(_rollback_on_exception)