2017-08-03 8 views
1

Ich arbeite an einem Python/Django-Projekt, und wir müssen zwei Datenbanken verwenden. Im Anschluss an die Dokumentation habe ich eine zweite Datenbank wie folgt aus:Warum habe ich dieses Datenbankproblem?

DATABASE_URL = os.getenv('DATABASE_URL', 'postgres://*******:********@aws-us-***********:*****/*****') 
CURRENCIES_URL = os.getenv('CURRENCIES_URL', 'postgres://*******:********@aws-us-***********:*****/*****') 

DATABASES = { 
    'default': dj_database_url.parse(DATABASE_URL), 
    'currencies': dj_database_url.parse(CURRENCIES_URL) 
} 

Die Parse() -Methode, die Daten in dem Format gibt das Objekt erwartet.

Dann habe ich diesen Code:

currencies = connection['currencies'].cursor() 

Im Grunde ist dies erlaubt es mir, benutzerdefinierte SQL-Code auf der Datenbank ausgeführt werden, durch seinen Cursor zurückkehrt und es in currencies

jedoch zu speichern, wenn Sie diesen Code I läuft erhalten diese in der Konsole:

url(r'^', include('btcmag.urls', namespace="btcmag")), 
    File "/Users/john/.virtualenvs/btcmag/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 50, in include 
    urlconf_module = import_module(urlconf_module) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/Users/john/btcmag/btcmag/urls.py", line 7, in <module> 
    from . import views 
    File "/Users/john/btcmag/btcmag/views.py", line 4, in <module> 
    from .apis import getTrendingArticles, getTickers, getCurrency, getHistory 
    File "/Users/john/btcmag/btcmag/apis.py", line 9, in <module> 
    currencies = connection['currencies'].cursor() 
TypeError: 'DefaultConnectionProxy' object has no attribute '__getitem__' 

eine Klarstellung:

  • Wenn ich laufe nur currencies = connection.cursor() verwendet es die default Datenbank und funktioniert gut, was mir sagt, es ist nicht das Verbindungsmodul

  • Wenn ich currencies und default in den Datenbanken Einstellungen schalten Sie es auch gut funktioniert - läuft currencies = connection.cursor() - Verwenden Sie den Währungs-DB als Standard. Also ist die DB auch nicht das Problem.

Was könnte das Problem hier verursachen?

Antwort

3

Es ist ein kleiner, aber fatal Tippfehler in Ihrem Code. Es sollte django.db.connections statt Ihrer connection sein (Sie haben nicht angegeben, woher das kommt).

von https://docs.djangoproject.com/en/1.11/topics/db/sql/#executing-custom-sql-directly

Zitiert Wenn Sie mehr als eine Datenbank verwenden, können Sie django.db.connections verwenden, um die Verbindung (und Cursor) für eine spezifische Datenbank zu erhalten. django.db.connections ist ein Wörterbuch-ähnliches Objekt , dass Sie eine bestimmte Verbindung mit seinem Alias ​​abrufen können:

from django.db import connections 
cursor = connections['my_db_alias'].cursor() 
# Your code here... 
1

Sie können nicht auf connection mit Bracket-Notation zugreifen.

Vielleicht wird diese Arbeit:

currencies = DATABASES['currencies'].cursor() 
+0

Eigentlich erkennen, Ihre Antwort hat mich, dass es ein weiteres Modul war „Verbindungen“ genannt und bei der Verwendung, dass ich in der Lage zu verbinden. Mein Problem war, dass ich stattdessen "Verbindung" verwendete. Perhpas willst du die Antwort umformulieren und ich werde sie als die richtige markieren –

Verwandte Themen