我在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转换,但不确定它是否会起作用。
答案 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调用它们并插入数据库,查看注册函数。
我试图自己解决这个问题