Wie kann ich erzwingen, Django, um eine Verbindung zu Oracle mit Service-Name
Q : Wie kann angeben, dass Django muss eine Verbindung zu Oracle-DB mit Hilfe von der service-name und SID nicht ?
Hallo,
Bin ich derzeit sagen, meine Django-Konfiguration für die Verbindung zu Oracle mit meinem SID.
Allerdings werde ich brauchen, um die Verbindung mit der service-name und nicht die SID.
APP_DATABASES={
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'myservice',
'USER': 'system',
'PASSWORD': 'admin123',
'HOST': '192.168.1.45',
'PORT': '1699',
}
}
Diese funktioniert einwandfrei.
Allerdings, Wenn ich ersetzen Sie "NAME" mit den Namen des service wie folgt
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'myservice.bose.com',
'USER': 'system',
'PASSWORD': 'admin123',
'HOST': '192.168.1.45',
'PORT': '1699',
}
Bekomme ich eine
ORA-12505: TNS:listener does not currently know of SID given in connect descriptor
Deutlich Django erzählt von Oracle für die Verbindung mit der SID, die ist nicht das, was ich will, Django zu tun.
Wie kann angeben, dass Django-Verbindung zur Oracle-DB mit den Dienst-und nicht SID ?
Hinweis : ich habe getestet, dass der Dienst namens erwähnt. Es funktioniert großartig von Oracle SQL Developer.
Dank - wäre wirklich sehr dankbar, führt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank Jungs, Es gibt eine "dokumentiert" Lösung:
Hinweis: Der HOST-und PORT-Tasten Links von der Wörterbuch - else Django wird versuchen, eine Verbindung mit der kompletten "NAMEN" als eine SID.
oracle://user:pass@/host.db.com:1699/oracle_service.db.com
(das war der trick:)Blick auf den code, die nickzam eingefügt:
.. es ist klar, dass, wenn Sie nicht an eine 'PORT' parameter 'NAME' parameter verwendet wird, 'wie Sie ist'. Daher die übergabe einer Oracle-connect-string als parameter 'NAME' wird den trick tun (wenn Sie entfernen die 'PORT' parameter).
Im Grunde so etwas wie dies funktionieren wird:
Ich habe versucht, dies mit einer SCAN-hostname für den HOST und verifiziert, dass das funktioniert.
ACHTUNG: Meine tests waren bisher beschränkt auf die überprüfung, ob der connect-string wird akzeptiert, wird eine Verbindung hergestellt und meine app erfolgreich bedient, auf die Daten zugreifen. Ehe Sie sich auf diese Konfiguration würde ich dir raten, aggressiver testen 8)
Hinter den kulissen Django verwendet cx_Oracle-Bibliothek, um eine Verbindung zu Oracle-Datenbank.
Quelle: https://github.com/django/django/blob/master/django/db/backends/oracle/base.py
Funktion cx_Oracle.make_dsn() unterstützt optionale parameter service_name (Auszug aus cx_Oracle-docs):
cx_Oracle.makedsn(host, port, sid[, service_name])
Return a string suitable for use as the dsn for the connect() method. This string is identical to the strings that are defined by the Oracle names server or defined in the tnsnames.ora file. If you wish to use the service name instead of the sid, do not include a value for the parameter sid and use the keyword parameter service_name instead.
Note
This method is an extension to the DB API definition.
Leider, Django ist nicht vorbei
service_name
parameter auf Verbindung.Wenn Sie es wirklich brauchen, hinzufügen von feature-request zu Django oder patch die lokale version von Django zu unterstützen SERVICE_NAME parameter (schlechte Idee, werden Sie brauchen, um es zu unterstützen, indem Sie sich selbst):
Dann ändern
NAME
zuSERVICE_NAME
- variable auf Ihren Zusammenhang 'default':Später, ich bin hinzufügen, wird es als pull-request zu Django Quelle.
Benutze ich tnsnames.ora. Es funktioniert für mich auf Django 1.7.
Dies sind die Schritte:
Fügen Sie einen Eintrag in der tnsnames.ora für die Verbindung.
Ändern Django Datenbank-Einstellungen zu
Details entnehmen Sie bitte Anschließen Django Oracle-Datenbank mit service-name