Pregunta

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

Soy consciente de mssql.django-pyodbc y django-mssql como back-end no oficialmente compatibles. Ambos proyectos parecen tener una sola persona contribuyendo, lo cual es un poco preocupante, aunque las contribuciones parecen ser algo regulares.

¿Hay algún otro back-end para SQL Server que sea compatible? ¿Los dos que mencioné aquí son "suficientemente buenos" para la producción? ¿Cuáles son tus experiencias?

¿Fue útil?

Solución

Como se ha dicho, django-pyodbc es un buen camino a seguir. PyODBC es probablemente la biblioteca más madura de SQL Server para Python que existe.

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 de ellos). puede llamarlos usando pymssql, pero lo evitaría si es posible, ya que no es compatible con la interfaz estándar DB-API y puede estar sujeto a cambios. Si necesita hacer esto, su mejor opción es usar adodbapi directamente (se incluye con el paquete python win32, que probablemente terminarás instalando de todos modos).

Otros consejos

En estos días

  • django-mssql : se produjo el error " NoneType no se puede llamar " sobre ./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. número 125 preguntando sobre el estado
      • EDITAR: recibí respuesta del mantenedor. Pronto se actualizará con Django 2.0
      • EDIT: el mantenedor lanzó la versión 2.0 para django 2.0
      • EDIT: el 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 un " moderno " Responde a esta pregunta. Implementé con éxito Django 1.11 en un servidor Ubuntu 16.04 de producción que se conecta a MS SQL Server 2017 que se ejecuta en otro servidor.

Primero, instale el controlador ODBC MS nativo " ODBC Driver 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, 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

Segundo, 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 BASES DE DATOS de su 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
        },
    },
}

Estoy omitiendo el resto de mi configuración (nginx, Gunicorn, Django REST Framework, etc.), pero eso está fuera del alcance de esta respuesta.

Actualización: esto se ha estado ejecutando en producción durante 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 realizan consultas SELECT en la misma tabla, que se corrigió con el isolation_level ajuste. El sistema obtiene alrededor de 2k nuevos usuarios cada día.

Estamos utilizando django-mssql en producción en nuestra empresa. 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ó drásticamente 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ó demasiado.

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

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

django.core.exceptions.ImproperlyConfigured: 'sqlserver_ado' isn't an available database backend.
Try using django.db.backends.XXX, where XXX is one of:
  'dummy', 'mysql', 'oracle', 'postgresql_psycopg2', 'sqlite3'
Error was: No module named sqlserver_ado.base

La solución está instalando el siguiente complemento:

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

Todavía 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 Python Win32 y obtener el módulo sqlserver_ado en su ruta Python. A partir de ahí, solo usa sql_server.pyodbc como su DATABASE_ENGINE. Hasta ahora no he notado que falta nada, pero tampoco lo he golpeado completamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top