Setting Django up to use MySQL

PythonMysqlDjangoDebian

Python Problem Overview


I want to move away from PHP a little and learn Python. In order to do web development with Python I'll need a framework to help with templating and other things.

I have a non-production server that I use to test all of web development stuff on. It is a Debian 7.1 LAMP stack that runs MariaDB instead of the common MySQL-server package.

Yesterday I installed Django and created my first project called firstweb. I have not changed any settings yet.

Here is my first big piece of confusion. In the tutorial I followed the guy installed Django, started his first project, restarted Apache, and Django just worked from then on. He went to his browser and went to the Django default page with no problems.

Me however, I have to cd into my firstweb folder and run

python manage.py runserver myip:port

And it works. No problem. But I'm wondering if it is supposed to work like this, and if this will cause problems down the line?

My second question is that I want to set it up so it uses my MySQL database. I go into my settings.py under /firstweb/firstweb and I see ENGINE and NAME but I'm not sure what to put here.

And then in the USER, PASSWORD, and HOST areas is this my database and its credentials? If I am using localhost can I just put localhost in the HOST area?

Python Solutions


Solution 1 - Python

MySQL support is simple to add. In your DATABASES dictionary, you will have an entry like this:

DATABASES = {
	'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'DB_NAME',
        'USER': 'DB_USER',
        'PASSWORD': 'DB_PASSWORD',
        'HOST': 'localhost',   # Or an IP Address that your DB is hosted on
        'PORT': '3306',
	}
}

You also have the option of utilizing MySQL option files, as of Django 1.7. You can accomplish this by setting your DATABASES array like so:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/path/to/my.cnf',
        },
    }
}

You also need to create the /path/to/my.cnf file with similar settings from above

[client]
database = DB_NAME
host = localhost
user = DB_USER
password = DB_PASSWORD
default-character-set = utf8

With this new method of connecting in Django 1.7, it is important to know the order connections are established:

1. OPTIONS.
2. NAME, USER, PASSWORD, HOST, PORT
3. MySQL option files.

> 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.


If you are just testing your application on your local machine, you can use

python manage.py runserver

Adding the ip:port argument allows machines other than your own to access your development application. Once you are ready to deploy your application, I recommend taking a look at the chapter on Deploying Django on the djangobook

Mysql default character set is often not utf-8, therefore make sure to create your database using this sql:

CREATE DATABASE mydatabase CHARACTER SET utf8 COLLATE utf8_bin

If you are using Oracle's MySQL connector your ENGINE line should look like this:

'ENGINE': 'mysql.connector.django',

Note that you will first need to install mysql on your OS.

brew install mysql (MacOS)

Also, the mysql client package has changed for python 3 (MySQL-Client works only for python 2)

pip3 install mysqlclient

Solution 2 - Python

To the very first please run the below commands to install python dependencies otherwise python runserver command will throw error.

sudo apt-get install libmysqlclient-dev
sudo pip install MySQL-python

Then configure the settings.py file as defined by #Andy and at the last execute :

python manage.py runserver

Have fun..!!

Solution 3 - Python

If you are using python3.x then Run below command

pip install mysqlclient

Then change setting.py like

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'DB',
     'USER': 'username',
    'PASSWORD': 'passwd',
  }
  }

Solution 4 - Python

As all said above, you can easily install xampp first from https://www.apachefriends.org/download.html Then follow the instructions as:

  1. Install and run xampp from http://www.unixmen.com/install-xampp-stack-ubuntu-14-04/, then start Apache Web Server and MySQL Database from the GUI.

  2. You can configure your web server as you want but by default web server is at http://localhost:80 and database at port 3306, and PhpMyadmin at http://localhost/phpmyadmin/

  3. From here you can see your databases and access them using very friendly GUI.

  4. Create any database which you want to use on your Django Project.

  5. Edit your settings.py file like:

    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DB_NAME',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': '',
    }}
    
  6. Install the following packages in the virtualenv (if you're using django on virtualenv, which is more preferred):

    sudo apt-get install libmysqlclient-dev

    pip install MySQL-python

  7. That's it!! you have configured Django with MySQL in a very easy way.

  8. Now run your Django project:

    python manage.py migrate

    python manage.py runserver

Solution 5 - Python

Actually, there are many issues with different environments, python versions, so on. You might also need to install python dev files, so to 'brute-force' the installation I would run all of these:

sudo apt-get install python-dev python3-dev
sudo apt-get install libmysqlclient-dev
pip install MySQL-python
pip install pymysql
pip install mysqlclient

You should be good to go with the accepted answer. And can remove the unnecessary packages if that's important to you.

Solution 6 - Python

Run these commands

sudo apt-get install python-dev python3-dev
sudo apt-get install libmysqlclient-dev
pip install MySQL-python 
pip install pymysql
pip install mysqlclient

Then configure settings.py like

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_db',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': '123456',
    }
}

Enjoy mysql connection

Solution 7 - Python

  1. Install mysqlclient

sudo pip3 install mysqlclient

if you get error:

> Command "python setup.py egg_info" failed with error code 1 in > /tmp/pip-install-dbljg4tx/mysqlclient/

then:

 1. sudo apt install libmysqlclient-dev python-mysqldb

 2. sudo pip3 install mysqlclient

  1. Modify settings.py

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'website',
            'USER': 'root',
            'PASSWORD': '',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'OPTION': {'init_command':"SET sql_mode='STRICT_TRANS_TABLE',"},
        }
    }
    

Solution 8 - Python

Andy's answer helps but if you have concern on exposing your database password in your django setting, I suggest to follow django official configuration on mysql connection: https://docs.djangoproject.com/en/1.7/ref/databases/

Quoted here as:

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/path/to/my.cnf',
        },
    }
}


# my.cnf
[client]
database = NAME
user = USER
password = PASSWORD
default-character-set = utf8

To replace 'HOST': '127.0.0.1' in setting, simply add it in my.cnf:

# my.cnf
[client]
database = NAME
host = HOST NAME or IP
user = USER
password = PASSWORD
default-character-set = utf8

Another OPTION that is useful, is to set your storage engine for django, you might want it in your setting.py:

'OPTIONS': {
   'init_command': 'SET storage_engine=INNODB',
}

Solution 9 - Python

settings.py

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'django',
    'USER': 'root',
    'PASSWORD': '*****',
    'HOST': '***.***.***.***',
    'PORT': '3306',
    'OPTIONS': {
        'autocommit': True,
    },
}

}

then:

python manage.py migrate

if success will generate theses tables:

auth_group
auth_group_permissions
auth_permission
auth_user
auth_user_groups
auth_user_user_permissions
django_admin_log
django_content_type
django_migrations
django_session

and u will can use mysql.

this is a showcase example ,test on Django version 1.11.5: Django-pool-showcase

Solution 10 - Python

Follow the given steps in order to setup it up to use MySQL database:

1) Install MySQL Database Connector :

	sudo apt-get install libmysqlclient-dev

2) Install the mysqlclient library :

	pip install mysqlclient

3) Install MySQL server, with the following command :

	sudo apt-get install mysql-server

4) Create the Database :

	i) Verify that the MySQL service is running:

		systemctl status mysql.service

	ii) Log in with your MySQL credentials using the following command where -u is the flag for declaring your username and -p is the flag that tells MySQL that this user requires a password :  

		mysql -u db_user -p


	iii) CREATE DATABASE db_name;

	iv) Exit MySQL server, press CTRL + D.

5) Add the MySQL Database Connection to your Application:

	i) Navigate to the settings.py file and replace the current DATABASES lines with the following:

		# Database
		# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

		DATABASES = {
		    'default': {
		        'ENGINE': 'django.db.backends.mysql',
		        'OPTIONS': {
		            'read_default_file': '/etc/mysql/my.cnf',
		        },
		    }
		}
		...

	ii) Next, let’s edit the config file so that it has your MySQL credentials. Use vi as sudo to edit the file and add the following information:

		sudo vi /etc/mysql/my.cnf

		database = db_name
		user = db_user
		password = db_password
		default-character-set = utf8

6) Once the file has been edited, we need to restart MySQL for the changes to take effect :

	systemctl daemon-reload

	systemctl restart mysql

7) Test MySQL Connection to Application:

	python manage.py runserver your-server-ip:8000

Solution 11 - Python

This is a considerably old question but if anyone is working on any latest versions of python and django you can follow the following steps

Note - Versions
    Python version - 3.9.5
    Django version - 3.2.4
    MySQL server version - 5.7

After installing django, run the following command

pip install mysqlclient

In my IDE if I do pip list this is the list of Packages and Versions

Package     Version
----------- -------
asgiref     3.3.4
Django      3.2.4
mysqlclient 2.0.3
pip         21.1.2
pytz        2021.1
setuptools  57.0.0
sqlparse    0.4.1

Now, make sure you already have created the Database schema you are going to use.

In the settings.py file of your django project under DATABASES change

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

to

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DB_NAME',
        'USER': 'DB_USER',
        'PASSWORD': 'DB_PASSWORD',
        'HOST': 'localhost',   # Or an IP Address that your DB is hosted on
        'PORT': '3306',
    }
}

You should be able to run both

python manage.py makemigrations

and

python manage.py migrate

Solution 12 - Python

You must create a MySQL database first. Then go to settings.py file and edit the 'DATABASES' dictionary with your MySQL credentials:

DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.mysql',
 'NAME': 'YOUR_DATABASE_NAME',
 'USER': 'YOUR_MYSQL_USER',
 'PASSWORD': 'YOUR_MYSQL_PASS',
 'HOST': 'localhost',   # Or an IP that your DB is hosted on
 'PORT': '3306',
 }
}

Here is a complete installation guide for setting up Django to use MySQL on a virtualenv:

http://codex.themedelta.com/how-to-install-django-with-mysql-in-a-virtualenv-on-linux/

Solution 13 - Python

python3 -m pip install mysql-connector
pip install mysqlclient

These commands helpful to settingup the mysql db in django without errors

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiongregorView Question on Stackoverflow
Solution 1 - PythonAndyView Answer on Stackoverflow
Solution 2 - PythonRiteshView Answer on Stackoverflow
Solution 3 - PythonManoj JadhavView Answer on Stackoverflow
Solution 4 - PythonrootView Answer on Stackoverflow
Solution 5 - PythonmimoraleaView Answer on Stackoverflow
Solution 6 - PythonDeepak KumarView Answer on Stackoverflow
Solution 7 - PythonShubham HarinkhedeView Answer on Stackoverflow
Solution 8 - PythonJiawei DaiView Answer on Stackoverflow
Solution 9 - PythonLuciferJackView Answer on Stackoverflow
Solution 10 - PythonShubham GuptaView Answer on Stackoverflow
Solution 11 - PythonSohailAQView Answer on Stackoverflow
Solution 12 - PythonSibi MView Answer on Stackoverflow
Solution 13 - PythonBalanagu YashwanthView Answer on Stackoverflow