为什么我有这个数据库问题?

时间:2017-08-03 16:04:30

标签: python django database postgresql

我正在研究Python / Django项目,我们需要使用两个数据库。在文档之后,我添加了第二个数据库,如下所示:

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)
}

parse()方法以对象期望的格式返回数据。

然后,我有这段代码:

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

基本上,这允许我在数据库上运行自定义SQL代码,方法是返回光标并将其存储在currencies

但是,在运行此代码时,我会在控制台中看到它:

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__'

一些澄清:

  • 当我只运行currencies = connection.cursor()时,它使用default数据库并且运行正常,这告诉我它不是连接模块

  • 如果我在数据库设置中切换currenciesdefault,它也可以正常运行currencies = connection.cursor() - 默认情况下使用货币数据库。所以数据库也不是问题。

这可能导致什么问题?

2 个答案:

答案 0 :(得分:3)

您的代码中有一个小而致命的拼写错误。它应该是django.db.connections而不是您的connection(您没有指明来自哪里)。

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

  

如果您使用多个数据库,则可以使用   django.db.connections获取连接(和游标)   特定数据库。 django.db.connections是一个类似字典的对象   允许您使用别名检索特定连接:

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

答案 1 :(得分:1)

您无法使用括号表示法访问connection

也许这会奏效:

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