Using Sql Server with Django in production Using Sql Server with Django in production python python

Using Sql Server with Django in production


As has been stated, django-pyodbc is a good way to go. PyODBC is probably the most mature SQL Server library for Python there is.

The only thing you may have problems with is that pyodbc doesn't support stored procedures very well (you can call them, but you have no way to get results from them). You can call them using pymssql, but I would avoid it if at all possible as it doesn't support the standard DB-API interface and may be subject to changes. If you need to do this, your best bet is to use adodbapi directly (it's included with the python win32 package, which you'll probably end up installing anyway).


These days

  • django-mssql: resulted in error "NoneType not callable" upon ./manage.py migrate
  • avidal/django-pyodbc: unmaintained. Replaced by:
    • django-pyodbc: no support for python 3
    • django-pyodbc-azure: works for me so far
      • EDIT: Seems to be unmaintained. Filed issue 125 asking about status
      • EDIT: got reply from maintainer. Will be made up-to-date with Django 2.0 soon
      • EDIT: maintainer released version 2.0 for django 2.0
      • EDIT: maintainer released version 2.1 for django 2.1

EDIT: Here are the package versions

Django==1.11.6django-mssql==1.8pyodbc==4.0.19django-pyodbc==1.1.1django-pyodbc-azure==1.11.0.0


Here's a "modern" answer to this question. I successfully deployed Django 1.11 on a production Ubuntu 16.04 server that connects to MS SQL Server 2017 running on another server.

First, install the native MS ODBC driver "ODBC Driver 17 for SQL Server":

# https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server#ubuntu-1404-1604-and-1710sudo sucurl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.listapt-get updateACCEPT_EULA=Y apt-get install msodbcsqlapt-get install unixodbc-dev# test you can actually get to port 1433 on the server that is running MS SQL:nc -z -v -w5 host.where.sql.server.is.running.com 1433# add /opt/mssql-tools/bin to your PATH in .bash_profile, e.g.:# PATH="$HOME/bin:$HOME/.local/bin:/opt/mssql-tools/bin:$PATH"# source ~/.bash_profile# now, test that you can actually connect to MS SQL Server:sqlcmd -S host.where.sql.server.is.running.com -U db_username -P db_password

Second, make sure you pip install these modules:

# https://github.com/michiya/django-pyodbc-azuredjango-pyodbc-azure==1.11.9.0# https://github.com/mkleehammer/pyodbc/wikipyodbc==4.0.22

Third, modify the DATABASES entry of your Django settings.py:

DATABASES = {    'default': {        'ENGINE': 'sql_server.pyodbc',        'NAME': 'db_name',        'USER': 'db_username',        'PASSWORD': 'db_password',        'HOST': 'host.where.sql.server.is.running.com',        'PORT': '1433',        'OPTIONS': {            'driver': 'ODBC Driver 17 for SQL Server',            'isolation_level': 'READ UNCOMMITTED',  # prevent SELECT deadlocks        },    },}

I'm omitting the rest of my configuration (nginx, Gunicorn, Django REST Framework, etc), but that's outside the scope of this answer.

Update: this has been running in production for 6+ months now and hasn't had any issues beyond MS SQL Server-specific deadlocks when multiple connections are doing SELECT queries on the same table, which was fixed with the isolation_level setting. The system gets about 2k new users every day.