python manage.py syncdb Tabellen erstellen

Django, Flask, Bottle, WSGI, CGI…
Antworten
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo zusammen,

ich benutze schon seid längerem Django in ich muss gestehen, dass es mir immer besser gefällt.
Nun habe ich aber ein kleines Problem.
wenn ich den Befehl:
python manage.py syncdb

wird die Django DB erstellt mit all den Tabellen für das Berechtigungssystem.
Nun will ich aber die Tabellen für meine Test Datenabk erstellen lassen und zwar so wie ich dies in den models des apps "test" definiert habe
Leider werden diese Tabellen immer in der Django Datenbank angelegt.

Kann mir jemand sagen warum? und wie ich es machen muss damit die Tabellen in meiner "test"
Datenbank angelegt werden

vielen Dank im voraus

Code: Alles auswählen

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', 
        'NAME': 'Django',                      
        'USER': 'Datenbank',
        'PASSWORD': 'geheim',
        'HOST': '127.0.0.1',                      
        'PORT': '5432',                        
    },
     'test': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', 
        'NAME': 'Test',                      
        'USER': 'Datenbank',
        'PASSWORD': 'geheim',
        'HOST': '127.0.0.1',                      
        'PORT': '5432',                        
    },
}
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

erdmulch hat geschrieben:Kann mir jemand sagen warum? und wie ich es machen muss damit die Tabellen in meiner "test"
Datenbank angelegt werden
Da würde ich mir in der Django-Dokumentation das Kapitel über Multiple Databases anschauen.

Warum möchtest du denn überhaupt mehrere Datenbanken verwenden?
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hab mir die Dokumentation mehrmals durchgelesen.
Nach einigen google versuchen bin ich zu dieser Lösung gekommen.
https://djangosteps.wordpress.com/2011/ ... in-django/
nach einigen Anpassungen konnte ich synchdb ausführen, allerdings hat sich nichts verändert, jetzt stellt sich natürlich die Frage, ob ich die Settings.py einfach so erweitern darf? oder ob Django dies ignoriert

hat jemand Erfahrung damit?

vielen Dank
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo erdmulch,
mir ist immer noch nicht ganz klar, was du erreichen möchtest, bzw. was dir fehlt?
Du schreibst:
erdmulch hat geschrieben: ...wird die Django DB erstellt mit all den Tabellen für das Berechtigungssystem.
Nun will ich aber die Tabellen für meine Test Datenabk erstellen lassen und zwar so wie ich dies in den models des apps "test" definiert habe
Leider werden diese Tabellen immer in der Django Datenbank angelegt. ...
1. Was ist deine "Testdatenbank"? Ein Abzug einer Produktivdatenbank oder soll das so was wie die Django-Testdatenbank zum Ausführen von unittest usw. sein?
2. Du erwähnst ausdrücklich "Berechtigungssystem". Und daraufhin "Leider werden diese Tabellen..." Meinst du damit die Djangos-"Berechtigungstabellen"?
3. Werden deine anderen Models in der Testdatenbank angelegt? Ich geh mal davon aus, dass du die Django-Testtabellen für die Ausführung von unittest meintest, die fehlen...
4. Oder werden alle Tabellen nicht in deiner Testdatenbank angelegt?

Falls du die Django-Testdatenbank meinst und du für deine (Unit)Test die Nutzer vermisst? Die werden standardmäßig nicht mit angelegt, sondern müssen von dir im Rahmen von Tests selbst eingerichtet werden...

Viele Grüße
Piet Lotus
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

normalerweise wird beim ausführen von "python manage.py synchdb" die Tabellenstruktur für das interne Berechtigungssystem von Django generiert. Was auch sehr gut funktioniert.

nun will ich auch die Tabellen von anderen Datenbanken erzeugen lassen. Z.B. besitze ich eine Datenbank mit den Namen "DB1", "DB2" usw.
meine Apps heißen in diesem Fall auch so: "DB1", "DB2" nun will ich die models in den Apps so konfigurieren, dass die entsprechenden Tabellen automatisch mit dem Befehl Python manage.py synchdb in meiner Datenbank ausgeführt wird.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@erdmulch:
Du musst Dir halt einen Router bauen, der die entsprechende DB-Verbindung auswählt. Wenn Du das auf Modelebene festlegen willst, könntest Du z.B. ein Model._meta definieren, welches den Verbindungsnamen enthält (ungetestet):

Code: Alles auswählen

# Model Bsp.
import django.db.models.options as options
options.DEFAULT_NAMES = options.DEFAULT_NAMES + ('use_db',)

class MyModel(Model):
    class Meta:
        use_db = 'DB1'
    ...

# Router Klasse
class MyRouter(object):
    def db_for_read(model, **hints):
        return getattr(model._meta, 'use_db', None)
    def db_for_write(model, **hints):
        return getattr(model._meta, 'use_db', None)
    def allow_syncdb(db, model):
        return getattr(model._meta, 'use_db', 'default') == db

# Eintrag in settings.py
DATABASE_ROUTERS = ['path.to.MyRouter']
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo erdmulch,
wenn ich dich richtig verstehe, wird keine deiner Tabellen in deinen "anderen" DBs angelegt. Du schreibst
erdmulch hat geschrieben: Nun habe ich aber ein kleines Problem.
wenn ich den Befehl:
python manage.py syncdb

wird die Django DB erstellt mit all den Tabellen für das Berechtigungssystem.
was passiert denn, wenn du

Code: Alles auswählen

python manage.py syncdb --database=HIER_NAMEN_EINER_DEINER_DATENBANKEN_ANGEBEN
ausführst?

Viele Grüße
Piet Lotus
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

dann werden die Tabellen von der Django Authentifizierung
in die Tabelle = HIER_NAMEN_EINER_DEINER_DATENBANKEN_ANGEBEN geschrieben.

wie macht ihr das?
alle Tabellen in die gleiche DB legen?
ich würde gerne je App eine DB benutzen
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

erdmulch hat geschrieben:ich würde gerne je App eine DB benutzen
Das ist eher unüblich, da viele Django-App als eine Art Modul implementiert sind, über welche man sich eine Teilfunktionalität reinholt und mit dieser dann die eigene Logik anreichert. Auf Modelebene kann man dann wunderbar echte DB-Relationen über "fremde" Models spannen, was im Falle der strikten Trennung der DB-Verbindungen nicht mehr ginge.

Die von Dir gewünschte Trennung macht imho nur Sinn fürs
- Einbinden von bestehenden legacy-DBs
- Vorhalten eines bestimmten Rechtesystems (z.B. auf DB-Ebene)
- 2. DBMS aufgrund anderer Funktionalitätsanforderungen

Erklär doch mal, warum Du diese Trennung willst. Eine höhere Sicherheit der DB-Daten erreichst Du damit nämlich nicht, da der Django-Prozess ja trotzdem alle DB-Adapter kennen muss.
Antworten