Integrere MS SQL Server med Django

Én av kjernefunksjonene til web-rammeverket Django er dets robuste databaseadaptere som brukes til å transformere “pythoniske” spørringer til SQL-syntaks. Nyeste versjon støtter ut av boksen fem relasjonelle databaser, inkludert populære valg som PostgreSQL og MySQL.

Bruker din bedrift derimot Microsoft SQL Server? Denne er ikke offisielt støttet av Django, så det å få disse to til å spille på lag kan virke utfordrende – men det trenger ikke være slik. Det finnes bibliotek som utvider støtten – blant annet mssql-django som publiseres av Microsoft selv.

I denne artikkelen tar vi for oss hvordan vi tok i bruk pakken for å støtte denne typen database i Django. Instruksjonene tar utgangspunkt i et utviklingsmiljø basert på MacOS med Homebrew og Docker installert. Du trenger minimum Django versjon 3.2 for å utføre installasjonen.

Installasjon

Start med å installere pakken gjennom din foretrukne python-pakkemanager:

pip install mssql-django

Vi valgte å legge til støtten for MS SQL ved å bruke Django’s multi-DB-funksjonalitet, slik at vi kan velge hvilken av databasene vi ønsker å koble til. Om du ønsker samme opplevelse, oppdater DATABASES i settings.py slik:

DATABASES = {
    # Access with `Model.objects.using("postgresql")`
    "postgresql": {
         ...
    },
    # Access with `Model.objects.using("mssql")`
    "mssql": {
        "ENGINE": "mssql",
        "HOST": os.getenv("DB_HOST", "localhost"),
        "PORT": os.getenv("DB_PORT", 1433),
        "NAME": os.getenv("DB_NAME", "master"),
        "USER": os.getenv("DB_USER", "sa"),
        "PASSWORD": os.getenv("DB_PASSWORD"),
        "OPTIONS": {
            "driver": "ODBC Driver 17 for SQL Server",  # Default
            "extra_params": (
                # Use this if connecting without SSL certs
                "TrustServerCertificate=yes;"
            ),
        },
    },
}


# If you prefer a drop-in replacement
DATABASES = {
    "default": DATABASES["mssql"]
}

Bruk disse env-variablene for å kontrollere tilkoblingen:

  • DB_HOST: Adressen til databasetjeneren
  • DB_PORT: Porten til databasetjeneren (standard for MS SQL er 1433)
  • DB_NAME: Navnet på databasen (standard for MS SQL er master)
  • DB_USER: Brukeren som kobler til (standard for MS SQL er sa)
  • DB_PASSWORD: Passordet til brukeren som kobler til

Ytterligere konfigurerbare valg for adapteren er beskrevet i den offisielle dokumentasjonen: https://github.com/microsoft/mssql-django#options

Testing

For å teste tilkoblingen før utrulling kan man spinne opp en lokal databasetjener. Microsoft tilbyr et Docker-image for enklere installasjon. For en enda enklere løsning har vi laget en Docker compose fil som kan hentes her: https://github.com/Ur-Solutions/MS-SQL-Server

services:
  mssql:
    # Documentation: https://mcr.microsoft.com/en-us/product/mssql/server/about
    image: mcr.microsoft.com/mssql/server:2019-latest
    restart: unless-stopped
    environment:
      ACCEPT_EULA: Y
      # Default username = "sa"
      MSSQL_SA_PASSWORD: "passWORD1" # At least 8 characters including uppercase, lowercase letters, base-10 digits and/or non-alphanumeric symbols.
      MSSQL_PID: Developer
    ports:
      - 1433:1433
    volumes:
      - ./data:/var/opt/mssql

Bytt ut Docker image-taggen (2019-latest) for å velge foretrukket versjon av databasen.

Django

I tillegg til databasetjeneren, er du nødt til å installere følgende pakker lokalt på maskinen din for å koble til gjennom Django:

# Install database driver for use with Django
brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
brew install msodbcsql17 mssql-tools

# mssql-django depends on pyodbc, which needs to be installed separately
brew install unixodbc
python -m pip install pyodbc

Merk at de samme pakkene også trengs å installeres i konteineren om du bygger et Docker-image av din Django-applikasjon!

For mer informasjon, se denne installasjonsguiden.

Nå kan du teste tilkoblingen ved å f.eks. kjøre:

python manage.py showmigrations --database=mssql

Fallgruver

Selv om det er lekende lett å komme i gang med MS SQL i Django, er det viktig å påpeke at dette er en egen databaseteknologi med både fordeler og ulemper man må være klar over. Det første man bør sjekke før man gjennomfører en slik endring er om man har i bruk noen PostgreSQL-spesifikke felttyper, f.eks. ArrayField, og undersøke om det finnes en tilsvarende type i MS SQL.

Databaseadapteren har også noen begrensninger, blant annet knyttet til datofelt med tidssone. Vi anbefaler å lese gjennom listen for å se om det er noen dealbreakere for akkurat din applikasjon. I vårt tilfelle var vi nødt til å gjøre manuelle endringer i enkelte migrasjonsfiler for at disse kunne utføres på MS SQL-tjeneren uten problemer.

Til slutt en påminnelse hvis du skriver rå SQL-spørringer; MS SQL-syntaksen er ulik f.eks. PostgreSQL sin. Vi antar de fleste som bruker Django i stor grad forholder seg til ORMen, men om du har områder som ikke gjør det er du nødt til å skrive om spørringene.

Skrevet av
Christian De Frène

Andre artikler