Domanda

Qualcuno ha avuto esperienza recente con la distribuzione di un'applicazione Django con un back-end del database SQL Server? Il nostro posto di lavoro è fortemente investito in SQL Server e non supporterà Django se non esiste un back-end sufficientemente sviluppato.

Sono a conoscenza di mssql.django-pyodbc e django-mssql come back-end supportati ufficiosamente. Entrambi i progetti sembrano avere una sola persona che contribuisce, il che è un po 'preoccupante sebbene i contributi sembrino in qualche modo regolari.

Esistono altri back-end per SQL Server che sono ben supportati? I due che ho menzionato qui sono "abbastanza buoni" per la produzione? Quali sono le tue esperienze?

È stato utile?

Soluzione

Come è stato affermato, django-pyodbc è una buona strada da percorrere. PyODBC è probabilmente la libreria SQL Server più matura per Python che esista.

L'unica cosa con cui potresti avere problemi è che pyodbc non supporta molto bene le procedure memorizzate (puoi chiamarle, ma non hai modo di ottenere risultati da esse). Puoi puoi chiamarli usando pymssql, ma lo eviterei se possibile, in quanto non supporta l'interfaccia DB-API standard e potrebbe essere soggetto a modifiche. Se è necessario, la soluzione migliore è utilizzare adodbapi direttamente (è incluso nel pacchetto python win32, che probabilmente finirai per installare comunque).

Altri suggerimenti

In questi giorni

  • django-mssql : errore " Nessuno Tipo non richiamabile " su ./manage.py migrate
  • avidal / django-pyodbc : non mantenuto. Sostituito da:
    • django-pyodbc : nessun supporto per python 3
    • django-pyodbc-azure : funziona per me finora
      • EDIT: sembra non essere mantenuto. Archiviato numero 125 chiedendo informazioni sullo stato
      • EDIT: risposta ottenuta dal manutentore. Presto sarà aggiornato con Django 2.0
      • EDIT: maintainer ha rilasciato la versione 2.0 per django 2.0
      • EDIT: maintainer ha rilasciato la versione 2.1 per django 2.1

EDIT: ecco le versioni del pacchetto

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

Ecco un " moderno " rispondere a questa domanda. Ho distribuito con successo Django 1.11 su un server Ubuntu 16.04 di produzione che si collega a MS SQL Server 2017 in esecuzione su un altro server.

Innanzitutto, installare il driver ODBC MS nativo " Driver ODBC 17 per 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

Secondo, assicurati di pip install questi moduli:

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

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

Terzo, modifica la voce DATABASES del tuo 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
        },
    },
}

Sto omettendo il resto della mia configurazione (nginx, Gunicorn, Django REST Framework, ecc.), ma non rientra nell'ambito di questa risposta.

Aggiornamento: è in esecuzione da oltre 6 mesi e non ha avuto problemi oltre i deadlock specifici di MS SQL Server quando più connessioni eseguono query SELECT sulla stessa tabella, che è stata risolta con isolation_level ambientazione. Il sistema riceve circa 2k nuovi utenti ogni giorno.

Stiamo usando django-mssql nella produzione presso la nostra azienda. Anche noi avevamo un sistema esistente che utilizza mssql. Per me personalmente è stata la migliore decisione di design che abbia mai preso perché la mia produttività è aumentata notevolmente ora che posso usare Django.

Ho inviato una patch, ma quando ho iniziato a usare django-mssql e ho fatto una o due settimane di test. Da allora (ottobre 2008) abbiamo eseguito il nostro sistema su django ed è funzionante. Ho anche provato Pyodbc ma non mi è piaciuto molto.

Stiamo eseguendo un sistema di riparazione in cui tutte le transazioni passano attraverso questo sistema 40 utenti pesanti. Se hai altre domande fammi sapere.

Ho visto così tante persone ottenere il seguente errore dopo aver installato django_mssql su 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 soluzione sta installando il seguente plug-in:

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

Non l'ho ancora usato in produzione, ma le mie esperienze iniziali con django-mssql sono state piuttosto solide. Tutto ciò che serve sono le estensioni Python Win32 e per ottenere il modulo sqlserver_ado sul tuo percorso Python. Da lì, basta usare sql_server.pyodbc come DATABASE_ENGINE. Finora non ho notato nulla che mancasse, ma non mi sono ancora completamente scagliato su di esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top