【问题标题】:python3 / pymongo "TypeError: 'NoneType' object is not subscriptable" within class类中的python3 / pymongo“TypeError:'NoneType'对象不可下标”
【发布时间】:2017-01-03 20:19:23
【问题描述】:

与 python 的一些人一起玩,新的和敏锐的,但感觉被打败了。 任何帮助将不胜感激。我是否尝试从烧瓶应用程序中查询 mongo,我似乎遗漏了某些内容或执行了非法操作:

local_settings = Database.find_sort(AdminConstants.COLLECTION, "admin.created_date", -1, 1)

它位于类的下方,似乎返回 None。这不应该是运行命令(没有类)在命令行上返回一个值的情况。我会在最后添加这个,希望有人可以为我解决这个问题。将它移到课堂之外仍然会导致错误 - 看到它在终端上工作并在我需要的地方失败,非常令人沮丧。

编辑:数据库当然是在程序的这一点上初始化的。 Edit2:永远不要对自己太自信;)

代码: 数据库.py

import pymongo
class Database(object):
    URI = "mongodb://127.0.0.1:27017"
    DATABASE = None

    @staticmethod
    def initialize():
        client = pymongo.MongoClient(Database.URI)
        Database.DATABASE = client['cvm']

    @staticmethod
    def find_sort(collection, query, direction, limit):
        return Database.DATABASE[collection].find({}).sort(query, direction).limit(limit)

admin.py

from src.common.database import Database

class Admin(object):
    local_settings = Database.find_sort(AdminConstants.COLLECTION, "admin.created_date", -1, 1)

错误输出:

Traceback (most recent call last):
  File "/home/frank/PycharmProjects/cvm/src/run.py", line 1, in <module>
    from src.app import app
  File "/home/frank/PycharmProjects/cvm/src/app.py", line 19, in <module>
    from src.models.admin.views import admin_blueprint
  File "/home/frank/PycharmProjects/cvm/src/models/admin/views.py", line 4, in <module>
    from src.models.admin.admin import Admin
  File "/home/frank/PycharmProjects/cvm/src/models/admin/admin.py", line 6, in <module>
    class Admin(object):
  File "/home/frank/PycharmProjects/cvm/src/models/admin/admin.py", line 8, in Admin
    local_settings = Database.find_sort(AdminConstants.COLLECTION, "admin.created_date", -1, 1)
  File "/home/frank/PycharmProjects/cvm/src/common/database.py", line 27, in find_sort
    return (Database.DATABASE[collection].find({}).sort(query, direction).limit(limit))
TypeError: 'NoneType' object is not subscriptable

终端:

Python 3.4.3 (default, Aug  9 2016, 15:36:17)
>>> import pymongo
>>> URI = "mongodb://127.0.0.1:27017"
>>> client = pymongo.MongoClient(URI)
>>> DATABASE = client['cvm']
>>> def find_sort(collection, query, direction, limit):
...     return DATABASE[collection].find().sort(query, direction).limit(limit)
... 
>>> COLLECTION = "admin"
>>> tmp1 = find_sort(COLLECTION, "created_date", -1, 1)
>>> list(tmp1)
[{'created_date': '20161212', '_id': ObjectId('5863f28d101bbd88b70be948')}]

感谢您的宝贵时间。

【问题讨论】:

  • 好吧,您说数据库已初始化,但该错误清楚地告诉您它不是 - 我不知道它是怎么回事。你认为你是在哪里做的?
  • 我以为我在我的 app.py 中进行了初始化,但事实并非如此,需要在管理类中调用初始化。我不认为这是必需的,但显然是新手的疏忽。请作为答案发布,我会将其标记为已接受。谢谢

标签: python mongodb python-3.x pymongo


【解决方案1】:

您需要创建Database 类的实例来调用find_sort。然后你可以使用python self keyword

class Database(object):
    URI = "mongodb://127.0.0.1:27017"
    DATABASE = None

    @staticmethod
    def initialize(self):
        client = pymongo.MongoClient(self.URI)
        self.DATABASE = client['cvm']

    @staticmethod
    def find_sort(self, collection, query, direction, limit):
        return self.DATABASE[collection].find({}).sort(query, direction).limit(limit)

那么这应该工作:

Database().find_sort(AdminConstants.COLLECTION, "admin.created_date", -1, 1)

【讨论】:

  • 感谢您的回答。这实际上是我的疏忽,我相信我的 app.py 会为整个应用程序初始化数据库,而我需要在类需要它时进行初始化。
【解决方案2】:

正如 Daniel Roseman 所发现的,数据库未初始化。我相信这是从较早的电话中完成的,但在课堂上是必需的。

Well you say the database is initialised, but that error clearly tells you it isn't - and I don't know how it could be. Where do you think you're doing that? – Daniel Roseman Dec 29 '16 at 17:53


I thought I was initialising in my app.py, this was not the case and needed to call for the initialisation in the admin class. I didn't think this was required but clearly an oversight by a novice. Please post as an answer and I'll mark it as accepted. Thank you – the_frank Dec 30 '16 at 11:41   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2019-08-12
    相关资源
    最近更新 更多