我在 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/