{"id":178,"date":"2025-05-14T08:49:33","date_gmt":"2025-05-14T08:49:33","guid":{"rendered":"https:\/\/kingstatue.com\/?p=178"},"modified":"2025-05-14T08:49:33","modified_gmt":"2025-05-14T08:49:33","slug":"djangos-flexible-backend-support-how-django-web-application-uses-different-databases","status":"publish","type":"post","link":"https:\/\/www.kingstatue.com\/?p=178","title":{"rendered":"Django&#8217;s Flexible Backend Support &#8211; How Django Web Application Uses Different Databases"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A Django web application can work with multiple databases such as <strong>SQLite<\/strong>, <strong>PostgreSQL<\/strong>, <strong>MySQL<\/strong>, <strong>Oracle<\/strong>, <strong>MS SQL Server<\/strong>, or even <strong>MongoDB<\/strong> (with third-party support). <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Django uses a component called <strong>Database Backend (DB engine)<\/strong> configured in <code>settings.py<\/code> to communicate with different database systems.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ORM<\/strong> (Object Relational Mapping)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In Django, <strong>ORM<\/strong> stands for <strong>Object-Relational Mapping<\/strong>. It\u2019s a powerful feature that allows developers to interact with the database using <strong>Python code instead of SQL<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ORM<\/strong> is a layer that translates <strong>Python objects<\/strong> (like classes and attributes) to <strong>database tables and columns<\/strong>, and vice versa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of writing raw SQL queries, you define <strong>models<\/strong> in Python, and Django ORM handles all the SQL behind the scenes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How Django ORM Works<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Define Models (Python Classes)<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You create models in <code>models.py<\/code> using Django&#8217;s <code>Model<\/code> class.<\/li>\n\n\n\n<li>Each model represents a <strong>table<\/strong>, and each attribute becomes a <strong>column<\/strong>.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>from django.db import models\n\nclass Book(models.Model):\n    title = models.CharField(max_length=100)\n    author = models.CharField(max_length=100)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Migrations (Translate Models to SQL)<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Django generates SQL code to create the actual database schema.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>python manage.py makemigrations\npython manage.py migrate<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Querying with Python<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Instead of writing SQL, you use model methods to perform CRUD operations.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># Create\nBook.objects.create(title=\"Geetha\", author=\"Vyasadeva\")\n\n# Read\nbooks = Book.objects.all()\n\n# Update\nbook = Book.objects.get(id=1)\nbook.title = \"Bhagavad Gita\"\nbook.save()\n\n# Delete\nbook.delete()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Database Abstraction<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You can switch between databases (e.g., SQLite, PostgreSQL, MySQL) without changing your model code.<\/li>\n\n\n\n<li>Just update the <code>DATABASES<\/code> setting in <code>settings.py<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">When you call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Book.objects.filter(author=\"Vyasa\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Django internally translates it to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT * FROM book WHERE author = 'Vyasa';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Handles all execution and result conversion automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Django uses ORM, so your model code is the same regardless of the backend:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Book(models.Model):\n    title = models.CharField(max_length=100)\n    author = models.CharField(max_length=100)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.kingstatue.com\/wp-content\/uploads\/2025\/05\/image-1-1024x683.png\" alt=\"\" class=\"wp-image-180\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You don\u2019t change the model when switching databases.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Architecture<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.kingstatue.com\/wp-content\/uploads\/2025\/05\/image-1024x683.png\" alt=\"\" class=\"wp-image-179\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Switching Databases<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To switch databases:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Install required adapter.<\/li>\n\n\n\n<li>Change <code>ENGINE<\/code> in <code>settings.py<\/code>.<\/li>\n\n\n\n<li>Update credentials.<\/li>\n\n\n\n<li>Run <code>migrate<\/code>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">No need to change your models or views.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step-by-Step Process<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Install Django and the Required Database Driver<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For SQLite \u2013 Built-in with Python. No installation needed.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For PostgreSQL \u2013 Install <code>psycopg2<\/code>:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pip install psycopg2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For MySQL \u2013 Install <code>mysqlclient<\/code>:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install mysqlclient<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For MS SQL Server \u2013 Use third-party backend like <code>django-mssql-backend<\/code>:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install django-mssql-backend<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For Oracle \u2013 Install <code>cx_Oracle<\/code>:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pip install cx_Oracle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For MongoDB \u2013 Use third-party ORM like <code>djongo<\/code> or <code>mongoengine<\/code>:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pip install djongo<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Step 2: Configure <code>DATABASES<\/code> in <code>settings.py<\/code><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>SQLite<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': BASE_DIR \/ \"db.sqlite3\",\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PostgreSQL:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DATABASES = {\n'default': {\n'ENGINE': 'django.db.backends.postgresql',\n'NAME': 'your_db',\n'USER': 'your_user',\n'PASSWORD': 'your_password',\n'HOST': 'localhost',\n'PORT': '5432',\n}\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>MySQL:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DATABASES = {\n'default': {\n'ENGINE': 'django.db.backends.mysql',\n'NAME': 'your_db',\n'USER': 'your_user',\n'PASSWORD': 'your_password',\n'HOST': 'localhost',\n'PORT': '3306',\n}\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>MS SQL Server:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DATABASES = {\n    'default': {\n        'ENGINE': 'mssql',\n        'NAME': 'your_db',\n        'USER': 'your_user',\n        'PASSWORD': 'your_password',\n        'HOST': 'localhost',\n        'PORT': '',  # Default is 1433\n        'OPTIONS': {\n            'driver': 'ODBC Driver 17 for SQL Server',\n        },\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Oracle:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.oracle',\n        'NAME': 'your_db',\n        'USER': 'your_user',\n        'PASSWORD': 'your_password',\n        'HOST': 'localhost',\n        'PORT': '1521',\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>MongoDB (<code>djongo<\/code>):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DATABASES = {\n    'default': {\n        'ENGINE': 'djongo',\n        'NAME': 'your_db',\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Run Migrations<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python manage.py makemigrations<br>python manage.py migrate<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Django uses ORM, so your model code is the same regardless of the backend<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">Benefits of Django ORM<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li> <strong>Write clean, readable Python code instead of SQL.<\/strong><\/li>\n\n\n\n<li> <strong>Easier to maintain and refactor.<\/strong><\/li>\n\n\n\n<li> <strong>Automatically handles relationships, joins, and validations.<\/strong><\/li>\n\n\n\n<li> <strong>Database-independent, Easily adaptable to various databases<\/strong><\/li>\n\n\n\n<li>S<strong>ame code works with different databases.<\/strong><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A Django web application can work with multiple databases such as SQLite, PostgreSQL, MySQL, Oracle, MS SQL Server, or even MongoDB (with third-party support). Django uses a component called Database&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19,5,6],"tags":[48,56,60,62,64,65,68,73],"class_list":["post-178","post","type-post","status-publish","format-standard","hentry","category-django","category-ms-sql-server-database","category-postgresql-database","tag-django","tag-mongodb","tag-mysql","tag-object-relational-mapping","tag-oracle","tag-orm","tag-postgresql","tag-sql-server"],"_links":{"self":[{"href":"https:\/\/www.kingstatue.com\/index.php?rest_route=\/wp\/v2\/posts\/178","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kingstatue.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kingstatue.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kingstatue.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kingstatue.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=178"}],"version-history":[{"count":0,"href":"https:\/\/www.kingstatue.com\/index.php?rest_route=\/wp\/v2\/posts\/178\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.kingstatue.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kingstatue.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kingstatue.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}