web-dev-qa-db-fra.com

Utilisation de Sql Server avec Django en production

Quelqu'un a-t-il une expérience récente du déploiement d'une application Django avec une base de données SQL Server? Notre lieu de travail est fortement investi dans SQL Server et ne prendra pas en charge Django si il n'y a pas de back-end suffisamment développé pour cela.

Je connais mssql.Django-pyodbc et Django-mssql en tant que back-end non officiellement pris en charge. Les deux projets semblent n'avoir qu'une seule personne qui contribue, ce qui est un peu inquiétant, bien que les contributions semblent assez régulières.

Existe-t-il d'autres serveurs principaux pour SQL Server qui sont bien pris en charge? Les deux que j'ai mentionnés ici sont-ils "assez bons" pour la production? Quelles sont vos expériences?

46
Josh Smeaton

Comme cela a été dit, Django-pyodbc est un bon chemin à parcourir. PyODBC est probablement la bibliothèque SQL Server la plus mature pour Python il y en a.

La seule chose avec laquelle vous pourriez avoir des problèmes est que pyodbc ne prend pas très bien en charge les procédures stockées (vous pouvez les appeler, mais vous n'avez aucun moyen d'en obtenir les résultats). Vous pouvez les appeler en utilisant pymssql, mais je l'éviterais si possible car il ne prend pas en charge l'interface DB-API standard et peut être soumis aux changements. Si vous devez le faire, votre meilleur pari est d'utiliser adodbapi directement (il est inclus avec le package python win32, que vous finirez probablement par installer de toute façon) .

21
Jason Baker

Ces jours-ci

  • Django-mssql : a généré l'erreur "NoneType not callable" lors de ./manage.py migrate
  • avidal/Django-pyodbc : non entretenu. Remplacé par:
    • Django-pyodbc : pas de support pour python 3
    • Django-pyodbc-Azure : fonctionne pour moi jusqu'à présent
      • EDIT: Semble être non entretenu. Déposé problème 125 demande le statut
      • EDIT: obtenu la réponse du responsable. Sera mis à jour avec Django 2.0 bientôt
      • EDIT: mainteneur a publié la version 2.0 pour Django 2.0
      • EDIT: mainteneur a publié la version 2.1 pour Django 2.1

EDIT: Voici les versions du package

Django==1.11.6
Django-mssql==1.8
pyodbc==4.0.19
Django-pyodbc==1.1.1
Django-pyodbc-Azure==1.11.0.0
13
shadi

Voici une réponse "moderne" à cette question. J'ai déployé avec succès Django 1.11 sur un serveur de production Ubuntu 16.04 qui se connecte à MS SQL Server 2017 fonctionnant sur un autre serveur.

Tout d'abord, installez le pilote natif MS ODBC "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-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

Deuxièmement, assurez-vous que pip install ces modules:

# https://github.com/michiya/Django-pyodbc-Azure
Django-pyodbc-Azure==1.11.9.0

# https://github.com/mkleehammer/pyodbc/wiki
pyodbc==4.0.22

Troisièmement, modifiez l'entrée BASES DE DONNÉES de votre 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
        },
    },
}

J'omets le reste de ma configuration (nginx, Gunicorn, Django REST Framework, etc.), mais cela sort du cadre de cette réponse.

Mise à jour: cela fonctionne en production depuis plus de 6 mois maintenant et n'a rencontré aucun problème au-delà des blocages spécifiques à MS SQL Server lorsque plusieurs connexions effectuent des requêtes SELECT sur la même table, ce qui a été corrigé avec le isolation_level réglage. Le système reçoit environ 2 000 nouveaux utilisateurs chaque jour.

7
Cloud Artisans

J'ai vu tant de gens obtenir l'erreur suivante après l'installation de Django_mssql sous Windows:

 Django.core.exceptions.ImproperlyConfigured: 'sqlserver_ado' n'est pas un backend de base de données disponible. 
 Essayez d'utiliser Django.db.backends.XXX, où XXX est l'un de: 
 'factice', 'mysql', 'Oracle', 'postgresql_psycopg2', 'sqlite3' 
 L'erreur était: Aucun module nommé sqlserver_ado.base 

La solution installe le plugin suivant:

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

4
Suresh

Nous utilisons Django-mssql en production dans notre entreprise. Nous avions également un système existant utilisant mssql. Pour moi personnellement, c'était la meilleure décision de conception que j'ai jamais prise car ma productivité a considérablement augmenté maintenant que je peux utiliser Django.

J'ai soumis un correctif mais quand j'ai commencé à utiliser Django-mssql et fait une semaine ou deux de tests. Depuis (octobre 2008), nous exécutons notre système sur Django et il fonctionne correctement. J'ai également essayé pyodbc mais je n'aimais pas trop.

Nous exécutons un système de réparation où toutes les transactions passent par ce système 40 utilisateurs lourds. Si vous avez d'autres questions, faites-le moi savoir.

4
Paul

Je ne l'ai pas encore utilisé en production, mais mes premières expériences avec Django-mssql ont été assez solides. Tout ce dont vous avez besoin sont les extensions Python Win32 et pour obtenir le module sqlserver_ado sur votre chemin Python. À partir de là, vous utilisez simplement sql_server.pyodbc comme votre DATABASE_ENGINE. Jusqu'à présent, je n'ai rien remarqué de manquant, mais je ne l'ai pas encore complètement frappé.

1
tghw