我有一个html表单,它有Firstname
、LastName
、Age
和{ADD
按钮。
我把数据输入表单,然后进入Berkeelys数据库。我的代码只打印最后一个值。我希望它应该显示与特定键相关的所有值
#!/usr/bin/python
import bsddb
import cgi
form = cgi.FieldStorage()
print "Content-type:text/html\n"
Fname = form.getvalue('firstname', '')
Lname = form.getvalue('lastname', '')
Age = form.getvalue('age', 0)
Gender = form.getvalue('gender', '')
#print Fname, Lname, Age
db = bsddb.hashopen("/home/neeraj/public_html/database/mydb.db","w")
db['FirstName'] = Fname
db['LastName'] = Lname
db['Age'] = Age
db['Gender'] = Gender
db.close()
db = bsddb.hashopen("/home/neeraj/public_html/database/mydb.db","r")
#db = bsddb.hashopen("/home/neeraj/public_html/database/mydb.db")
print db['FirstName'], db['LastName'], db['Age'], db['Gender']
db.close()
print db
通过设置duplicate标志,可以在berkeley数据库中针对单个密钥保存多个值
但是您不能使用BDB的“Get”方法检索所有这些项,您必须使用cursor检索项请参见documentation为此,或者可以使用
^{pr2}$输出将是
这将返回所有值属于键“1”的元组列表 希望这有帮助。在
您应该使用SQL数据库而不是基于
dict
的接口,因为SQL数据库已经处理了一个表中的多个元组。在无论如何,如果您想要一个
dict
接口,您可以使用shelve
模块(bsddb
不推荐使用,因此您应该避免它),并将每个值保存在list
中:以上代码输出:
^{pr2}$如果要使用SQL数据库,可以使用
sqlite3
模块。 例如:以上代码输出:
(注意
u'...'
只是表示字符串是unicode,它不会改变它们的值)然而,这段代码有一些问题(例如,尝试运行两次……),但是如果您想遵循这条路径,那么您必须先学习SQL,所以请继续学习(有很多在线教程)。例如
w3schools
个)。在将多个值关联到一个键的正确方法是使用例如json.dumps文件". 在
以下是一个例子:
这是与bsddb一起使用的基本模式,适用于其他键/值dbs,如leveldb。在
额外:
考虑到bsddb hashmap键是按字典顺序排序的(例如python2字符串),您可以使用键的可预测顺序来构建hashmap,从而省去遍历所有表的麻烦。在
为了更好地利用这个特性,你必须建立有用的键。同样,您需要一个打包函数,将python排序顺序转换为lexigraphic顺序(即
^{pr2}$11 > 2
但是"11" < "2"
)。下面是这样一个包装函数的例子:这有点天真,你可以多做一点,支持}来节省空间。在
float
和更好的打包{例如,给定简化模式
User(username, age)
,您可以构建另一个我们称为age_index
的哈希映射,使用它可以轻松地检索到 30岁。hashmap可以如下所示:这是一个人类可读的hasmap视图:密钥实际上与上面的
pack
函数打包在一起。如您所见,键是age
的组合,以及之前存储的项的primarykey
。在这种情况下,不使用该值,因为我们不需要它。请记住,每个键都是且必须是唯一的。在一旦该模式就位,您就可以使用^{} 执行“选择查询”,在bsddb中称为范围查询。这将把光标设置在最近的键上,并返回关联的键/值对(根据数据库,语义可能会有所不同)。在
例如,要检索第一个拥有
age=30
的人,可以使用以下代码:这将返回与用户
amz
关联的文档。在要进一步,需要使用另一个bsddb接口,它的入口点是}(documentation)。通过这个接口,您可以将多个hashmap绑定到同一个事务上下文,即使它不需要使用事务。在
bsddb.db.DB
和{相关问题 更多 >
编程相关推荐