codernitydb索引与字符串值

时间:2014-04-11 14:48:05

标签: python database codernity nosql

我在python中使用CodernityDB。

我想创建一个表,其中我的表中的一个索引将包含一个字符串而不是一个整数。

我该怎么做?

以下是我正在使用的教程:

#!/usr/bin/env python
from CodernityDB.database import Database
from CodernityDB.hash_index import HashIndex


class WithXIndex(HashIndex):

    def __init__(self, *args, **kwargs):
        kwargs['key_format'] = 'I'
        super(WithXIndex, self).__init__(*args, **kwargs)

    def make_key_value(self, data):
        a_val = data.get("x")
        if a_val is not None:
            return a_val, None
        return None

    def make_key(self, key):
        return key


def main():
    db = Database('/tmp/tut2')
    db.create()
    x_ind = WithXIndex(db.path, 'x')
    db.add_index(x_ind)

    for x in xrange(100):
        db.insert(dict(x=x))

    for y in xrange(100):
        db.insert(dict(y=y))

    print db.get('x', 10, with_doc=True)


if __name__ == '__main__':
    main()

基本上我想将字符串值放在x而不是整数值中,当我尝试这样做时,我收到一条错误消息:“无法将参数转换为整数”。

我确信这很容易,但我在他们的文档中找不到它。

可能我只需要在make_key_value函数中添加一个str转换,但不确定它是否会起作用。

2 个答案:

答案 0 :(得分:3)

这是mini twit函数的精简版本,我用它进行实验。

createDB,顾名思义创建一个数据库,并允许您使用数据填充它。

requestDat,对数据库有一些示例查询。 [如果你想出更多关于缩小实际数据值的查询,请从id索引中说,plz post]

createDB.py

from hashlib import md5
from werkzeug import check_password_hash, generate_password_hash
from CodernityDB.database_thread_safe import ThreadSafeDatabase
from CodernityDB.database import RecordNotFound



#indexTypes

from CodernityDB.hash_index import HashIndex
from CodernityDB.tree_index import TreeBasedIndex

class UserIndex(HashIndex):

    def __init__(self, *args, **kwargs):
        kwargs['key_format'] = '16s'
        super(UserIndex, self).__init__(*args, **kwargs)

    def make_key_value(self, data):
        if data['t'] == 'user':
            username = data['username']
            return md5(username).digest(), {'user_id': data['user_id'], 'email': data['email']}

    def make_key(self, key):
        return md5(key).digest()


class UserIDIndex(HashIndex):

    def __init__(self, *args, **kwargs):
        kwargs['key_format'] = 'I'
        super(UserIDIndex, self).__init__(*args, **kwargs)

    def make_key_value(self, data):
        if data['t'] == 'user':
            user_id = data['user_id']
            return user_id, {'username': data['username'], 'email': data['email']}

    def make_key(self, key):
        return key



#Functions
def register(username_input,email_input,password_input):
    """Registers the user."""

    try:
        cdb.get('user', username_input, with_storage=False)
    except RecordNotFound:
        cdb.insert(dict(
                    t='user',
                    user_id=cdb.count(cdb.all, 'user') + 1,  # do not use in production!
                    username=username_input,
                    email=email_input,
                    pw_hash=generate_password_hash(password_input)))
        print('You were successfully registered')
    else:
        print('The username is already taken')





# configuration
DATABASE = 'testDB'
SECRET_KEY = 'development key'
cdb = ThreadSafeDatabase(DATABASE)


#main
def main():
    if cdb.exists():
        cdb.open()
        cdb.reindex()
    else:
        #from database_indexes import UserIndex, MessageAllIndex, MessageUserIndex, FollowerRel1Index, FollowerRel2Index, UserIDIndex, FollowerIndex
        cdb.create()
        cdb.add_index(UserIndex(cdb.path, 'user'))
        cdb.add_index(UserIDIndex(cdb.path, 'user_id'))

    #test insert
    username_input="none"
    print("type 'n' to end database population")
    while username_input != "n":
        username_input = raw_input("new username: ")
        email_input = raw_input("new email: ")
        password_input = raw_input("new password: ")
        register(username_input,email_input,password_input)


#Run Main
if __name__ == '__main__':
    main()

requestDat.py

from hashlib import md5

from werkzeug import check_password_hash, generate_password_hash


from CodernityDB.database_thread_safe import ThreadSafeDatabase
from CodernityDB.database import RecordNotFound



#indexTypes

from CodernityDB.hash_index import HashIndex
from CodernityDB.tree_index import TreeBasedIndex




def get_user_id(username):
    """Convenience method to look up the id for a username."""
    try:
        rv = cdb.get('user', username, with_storage=True)
    except RecordNotFound:
        rv = None
    else:
        rv = rv['user_id']
    return rv

def get_id(username):
    """Convenience method to look up the id for a username."""
    try:
        rv = cdb.get('id', username, with_storage=True)
    except RecordNotFound:
        rv = None
    else:
        rv = rv['id']
    return rv

def get_username(user_id):
    """Convenience method to look up the id for a username."""
    try:
         rv = cdb.get('user', user_id, with_storage=True)
        # rv= user['doc']['pw_hash']
    except RecordNotFound:
        rv = None
    else:
        rv = rv['user_id']
    return rv

def get_allRecords(getRecord):
    """Convenience method to look up the id for a username."""
    try:
        #rv = cdb.get('username', user_id, with_storage=True)
        #cdb.all(getRecord)
        rv="\n"
        for curr in cdb.all(getRecord):
            rv = rv+str(curr)
    except RecordNotFound:
        rv = None
    else:
        rv = "all"
    return rv


# configuration
DATABASE = 'testDB'
SECRET_KEY = 'development key'
cdb = ThreadSafeDatabase(DATABASE)


#main
def main():
    if cdb.exists():
        cdb.open()
        cdb.reindex()
    else:
        #from database_indexes import UserIndex, MessageAllIndex, MessageUserIndex, FollowerRel1Index, FollowerRel2Index, UserIDIndex, FollowerIndex
        print("no database pressent")
        quit()

    print("type'n' to advance through prompts")

    useridRequest_input ="none"
    while useridRequest_input != "n":
        useridRequest_input = raw_input("get ID, search username: ")
        print(get_user_id(useridRequest_input))

    usernameRequest_input ="none"    
    while usernameRequest_input != "n":
        usernameRequest_input = raw_input("get username, search ID: ")
        print(get_username(usernameRequest_input))



    print ("counting id tags")
    print cdb.count(cdb.all, 'id')
    print("counting user_id tags")
    print cdb.count(cdb.all, 'user_id')
    for curr in cdb.all('id'):
        print curr


#Run Main
if __name__ == '__main__':
    main()

答案 1 :(得分:0)

https://bitbucket.org/codernity/codernitydb-demos/src/1bf5ae166fa5/minitwit/?at=default

有一些例子,请查看minitwit.py调用database_indexes.py

database_indexes.py: 有一些在keyValue对中存储数据的方法

minitwit.py调用它们并插入数据库,查看注册函数。

我试图自己解决这个问题