使用CouchDB Kit和Python;尝试设置数据库而不在线设置DB

0 投票
1 回答
515 浏览
提问于 2025-04-18 09:11

我正在使用 couchdbkit 来构建一个小的 Flask 应用,我想写一些 Python 模型,这样与数据库的交互会更简单(而不是直接写在代码里)。

这是我目前的代码:

base.py

from couchdbkit import *
from api.config import settings


class WorkflowsCloudant(Server):

    def __init__(self):
        uri = "https://{public_key}:{private_key}@{db_uri}".format(
            public_key=settings.COUCH_PUBLIC_KEY,
            private_key=settings.COUCH_PRIVATE_KEY,
            db_uri=settings.COUCH_DB_BASE_URL
        )
        super(self.__class__, self).__init__(uri)


class Base(Document):

    def __init__(self):
        server = WorkflowsCloudant.get_db(settings.COUCH_DB_NAME)
        self.set_db(server)
        super(self.__class__, self).__init__()

workflows.py

from couchdbkit import *
from api.models.base import Base


class Workflow(Base):
    workflow = DictProperty()
    account_id = IntegerProperty()
    created_at = DateTimeProperty()
    updated_at = DateTimeProperty()
    deleted_at = DateTimeProperty()
    status = StringProperty()

控制器

init.py

from api.models import Workflow

blueprint = Blueprint('workflows', __name__, url_prefix='/<int:account_id>/workflows')

@blueprint.route('/<workflow_id>')
def get_single_workflow(account_id, workflow_id):
    doc = Workflow.get(workflow_id)

    if doc['account_id'] != account_id:
        return error_helpers.forbidden('Invalid account')

    return Response(json.dumps(doc), mimetype='application/json')

我一直遇到的错误是:TypeError: doc database required to save document

我试着按照这里的设置来做(http://couchdbkit.org/docs/gettingstarted.html),但是我把他们的直接指令扩展到了一个更动态的环境中。此外,我还是个 Python 新手,所以对我不懂的地方请多包涵。

1 个回答

1

这个错误发生的原因是你的模型(文档)没有正确连接到数据库。你可以通过使用 set_db 方法来完成这个连接。

另外,我觉得你应该修改一下你的模型:

from couchdbkit import Document
from couchdbkit import StringProperty, IntegerProperty
from couchdbkit import DateTimeProperty,  DictProperty

class Workflow(Document):
    workflow = DictProperty()
    account_id = IntegerProperty()
    created_at = DateTimeProperty()
    updated_at = DateTimeProperty()
    deleted_at = DateTimeProperty()
    status = StringProperty()

我把基础类的继承改成了文档类。同时,尽量不要使用 from some_module import * 这种写法!

当你把模型设置好之后,就可以像下面这样把你的模型和 CouchDB 连接起来:

Workflow.set_db(server)

注意:这段代码没有经过测试。我是凭记忆写的,可能会有一些错误。

撰写回答