AllgemeinBlogDjangoLinuxPythonShell

multiple Datenbanken mit Django

Django hat durch sein MVC(Model-View-Controller) von Beginn an eine Datenbank mit am Board. Mein Projekt basiert auf mysql, jedoch hatte ich weitere Datenbanken, die ich über Django managen wollte, die allerdings nicht in der Default DB von Django sind. Daher müssen diese Django bekannt gemacht und Models für diese Datenbanken erstellt werden.

Die Bekanntmachung findet in der settings.py statt. Hier trägt man die weiteren DB Verbindungen ein. Dabei könnte es wie folgt aussehen. In dem DATABASE Dictionary können neben dem Default weitere Werte eingetragen werden. Die ENGINE bestimmt dabei, ob mysql, sqlite oder die anderen unterstützen DBs eingetragen werden. Im NAME steht der Name der Datenbank. User und Password sind selbsterklärend, genauso wie der HOST und der PORT. Ich habe insgesamt 2 weitere Datenbanken hinzugefügt.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
                'read_default_file': '~/Projekte/controlpanel/controlpanel_root/controlpanel/my.conf',
        },
    },
    'Weather': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Weather',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    },
     'Metabase': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Metabase',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '3306'

    }
}

Damit mit den neuen Datenbanken gearbeitet werden kann, müssen Models erzeugt werden. Django bietet dazu ein eigenständiges Werkzeug an, welches über die Tabellen geht und die Atribute niederschreibt. Führt ihr folgendes Befehl aus,

python3 manage.py inspectdb --database Weather

sollte im Terminal der Aufbau vom Model stehen, wie Django es aufbauen würde. Bei mir sieht es so aus:

 

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey has `on_delete` set to the desired behavior.
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models


class CurWeather(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    c_lon = models.DecimalField(db_column='C_LON', max_digits=5, decimal_places=2)  # Field name made lowercase.
    c_lat = models.DecimalField(db_column='C_LAT', max_digits=5, decimal_places=2)  # Field name made lowercase.
    w_main = models.CharField(db_column='W_MAIN', max_length=50)  # Field name made lowercase.
    w_description = models.CharField(db_column='W_DESCRIPTION', max_length=100)  # Field name made lowercase.
    w_icon = models.CharField(db_column='W_ICON', max_length=50)  # Field name made lowercase.
    m_temp = models.DecimalField(db_column='M_TEMP', max_digits=4, decimal_places=2)  # Field name made lowercase.
    m_pressure = models.DecimalField(db_column='M_PRESSURE', max_digits=7, decimal_places=2)  # Field name made lowercase.
    m_humidity = models.DecimalField(db_column='M_HUMIDITY', max_digits=7, decimal_places=2)  # Field name made lowercase.
    m_temp_min = models.DecimalField(db_column='M_TEMP_MIN', max_digits=7, decimal_places=2)  # Field name made lowercase.
    w_speed = models.DecimalField(db_column='W_SPEED', max_digits=4, decimal_places=2)  # Field name made lowercase.
    w_deg = models.DecimalField(db_column='W_DEG', max_digits=5, decimal_places=2)  # Field name made lowercase.
    rain_3h = models.DecimalField(db_column='RAIN_3H', max_digits=5, decimal_places=2, blank=True, null=True)  # Field name made lowercase.
    cloudiness = models.DecimalField(db_column='CLOUDINESS', max_digits=5, decimal_places=2)  # Field name made lowercase.
    dt_timestamp = models.DateTimeField(db_column='DT_TIMESTAMP')  # Field name made lowercase.
    sys_country = models.CharField(db_column='SYS_COUNTRY', max_length=4)  # Field name made lowercase.
    sys_sunrise = models.DateTimeField(db_column='SYS_SUNRISE')  # Field name made lowercase.
    sys_sunset = models.DateTimeField(db_column='SYS_SUNSET')  # Field name made lowercase.
    timezone = models.IntegerField(db_column='TIMEZONE')  # Field name made lowercase.
    city = models.ForeignKey('WeaCity', models.DO_NOTHING, db_column='CITY_ID')  # Field name made lowercase.
    created_at = models.DateTimeField(db_column='CREATED_AT')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'CUR_WEATHER'


class WeaCity(models.Model):
    id = models.IntegerField(db_column='ID', primary_key=True)  # Field name made lowercase.
    city_name = models.CharField(db_column='CITY_NAME', max_length=100)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'WEA_CITY'


class WeaOpenweather(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    query = models.CharField(db_column='QUERY', max_length=500)  # Field name made lowercase.
    city_id = models.IntegerField(db_column='CITY_ID')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'WEA_OPENWEATHER'

 

Diese Ausgabe sollte nun in eine Datei geleitet werden und schon existiert für die DB das Model.

python3 manage.py inspectdb --database Weather > pages/Weather.py

Allerdings nimmt Django nicht die komplette Arbeit ab. Wir müssen noch überprüfen, dass jedes Model mindestens ein Feld hat, wo das PrimaryKey Attribute True ist. Wenn Django Zeilen hinzufügen, entfernen und ändern darf, muss das managed Attribute noch auf True umgestellt werden.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.