Usando Sql Server con Django en producción

¿Alguien tiene experiencia reciente con la implementación de una aplicación Django con un servidor de base de datos de SQL Server? Nuestro lugar de trabajo tiene una gran inversión en SQL Server y no será compatible con Django si no hay un back-end suficientemente desarrollado para ello.

Soy consciente de mssql.djangopyodbc y django-mssql como back-end soportados extraoficialmente. Ambos proyectos parecen tener solo una persona contribuyendo, lo que es un poco preocupante, aunque las contribuciones parecen ser algo regulares.

¿Hay algún otro back-end para SQL Server que esté bien soportado? ¿Son los dos que mencioné aquí ‘suficientemente buenos’ para la producción? ¿Cuáles son tus experiencias?

Como se ha dicho, django-pyodbc es una buena manera de hacerlo. PyODBC es probablemente la biblioteca más madura de SQL Server para Python.

Lo único con lo que puede tener problemas es que pyodbc no admite muy bien los procedimientos almacenados (puede llamarlos, pero no tiene forma de obtener resultados). Puede llamarlos usando pymssql, pero lo evitaría si fuera posible, ya que no es compatible con la interfaz DB-API estándar y puede estar sujeto a cambios. Si necesita hacer esto, lo mejor es usar adodbapi directamente (se incluye con el paquete de python win32, que probablemente terminará instalando de todos modos).

Estos días

  • django-mssql : se produjo el error “NoneType not tlamable” en ./manage.py migrate
  • avidal / django-pyodbc : sin mantenimiento. Reemplazado por:
    • django-pyodbc : no hay soporte para python 3
    • django-pyodbc-azure : funciona para mí hasta ahora
      • EDITAR: Parece estar sin mantenimiento. Problema presentado 125 preguntando sobre el estado
      • EDITAR: tengo respuesta del mantenedor. Pronto se actualizará con Django 2.0.
      • EDITAR: mantenedor lanzado versión 2.0 para django 2.0
      • EDITAR: mantenedor lanzó la versión 2.1 para django 2.1

EDITAR: Aquí están las versiones del paquete

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

Aquí hay una respuesta “moderna” a esta pregunta. Implementé con éxito Django 1.11 en un servidor de producción 16.04 de Ubuntu que se conecta a MS SQL Server 2017 y se ejecuta en otro servidor.

Primero, instale el controlador ODBC de MS “Controlador ODBC 17 para 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-1710 sudo su curl 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.list apt-get update ACCEPT_EULA=Y apt-get install msodbcsql apt-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, eg: # 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 

En segundo lugar, asegúrese de pip install estos módulos:

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

Tercero, modifique la entrada de BASES DE DATOS de su settings.py Django.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 }, }, } 

Omito el rest de mi configuración (nginx, Gunicorn, Django REST Framework, etc.), pero eso está fuera del scope de esta respuesta.

Actualización: esto se ha estado ejecutando en producción por más de 6 meses y no ha tenido ningún problema más allá de los puntos muertos específicos de MS SQL Server cuando varias conexiones están realizando consultas de SELECT en la misma tabla, que se corrigió con la configuración isolation_level . El sistema recibe alrededor de 2k nuevos usuarios cada día.

Estamos utilizando django-mssql en producción en nuestra empresa. Nosotros también teníamos un sistema existente usando mssql. Para mí, personalmente, fue la mejor decisión de diseño que he tomado porque mi productividad aumentó considerablemente ahora que puedo usar django.

Envié un parche, pero cuando comencé a usar django-mssql e hice una o dos semanas de pruebas. Desde entonces (octubre de 2008) ejecutamos nuestro sistema en django y se ejecuta de manera sólida. También probé pyodbc pero no me gustó mucho.

Estamos ejecutando un sistema de reparación donde todas las transacciones se ejecutan a través de este sistema de 40 usuarios pesados. Si tienes más preguntas házmelo saber.

He visto a muchas personas obtener el siguiente error después de instalar django_mssql en Windows:

 django.core.exceptions.ImproperlyConfigured: 'sqlserver_ado' no es un servidor de base de datos disponible.
 Intente usar django.db.backends.XXX, donde XXX es uno de:
   'dummy', 'mysql', 'oracle', 'postgresql_psycopg2', 'sqlite3'
 El error fue: Ningún módulo llamado sqlserver_ado.base

La solución está instalando el siguiente plugin:

http://sourceforge.net/projects/pywin32/

Aún no lo he usado en producción, pero mis experiencias iniciales con django-mssql han sido bastante sólidas. Todo lo que necesita son las extensiones de Python Win32 y obtener el módulo sqlserver_ado en su ruta de Python. A partir de ahí, solo usa sql_server.pyodbc como su DATABASE_ENGINE . Hasta ahora no he notado que falte nada, pero tampoco lo he golpeado por completo.