python - 带有字符串值的 codernitydb 索引

标签 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 转换,但不确定它是否有效。

最佳答案

这是 mini twit 函数的精简版,我用它来做实验。

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

requestDat,有一些对数据库的示例查询。 [如果您提出更多查询来缩小实际数据值的范围,请从 id 索引说起,请发帖]

创建数据库.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()

请求数据.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()

关于python - 带有字符串值的 codernitydb 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23015868/

相关文章:

sql - 基于多列select语句插入语句

database - 使用事务从数据库中安全删除 Django 模型

python - 并非所有组都在 Telethon 中可见

python - 如何添加多个具有固定值的新列?

python - 使用 python 属性的奇怪结果

python - 以百万为单位设置 y Axis

sql - 字段列表中的未知列 X