PageRenderTime 27ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/django/db/__init__.py

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