python数据库实现

时间:2013-06-28 20:21:11

标签: python python-2.7

我正在尝试在python中实现一个简单的数据库程序。我到达了向数据库添加元素,更改值等的点。

class db:
    def __init__(self):
            self.database ={}

    def dbset(self, name, value):
            self.database[name]=value

    def dbunset(self, name):
            self.dbset(name, 'NULL')

    def dbnumequalto(self, value):
            mylist = [v for k,v in self.database.items() if v==value]
            return mylist

def main():
    mydb=db()
    cmd=raw_input().rstrip().split(" ")
    while cmd[0]!='end':
            if cmd[0]=='set':
                    mydb.dbset(cmd[1], cmd[2])
            elif cmd[0]=='unset':
                    mydb.dbunset(cmd[1])
            elif cmd[0]=='numequalto':
                    print len(mydb.dbnumequalto(cmd[1]))
            elif cmd[0]=='list':
                    print mydb.database
            cmd=raw_input().rstrip().split(" ")

if __name__=='__main__':
    main()

现在,作为下一步,我希望能够在此python代码中执行嵌套事务。我使用BEGIN命令开始一组命令,然后使用COMMIT语句提交它们。提交应该提交所有开始的事务。但是,回滚应将更改还原为最近的BEGIN。我无法为此提出合适的解决方案。

3 个答案:

答案 0 :(得分:7)

一种简单的方法是保留一个“交易”列表,其中包含您能够回滚待处理更改所需的所有信息:

def dbset(self, name, value):
    self.transaction.append((name, self.database.get(name)))
    self.database[name]=value

def rollback(self):
    # undo all changes
    while self.transaction:
        name, old_value = self.transaction.pop()
        self.database[name] = old_value

def commit(self):
    # everything went fine, drop undo information
    self.transaction = []

答案 1 :(得分:1)

如果您正在将此作为学术练习,您可能需要查看 Python Cookbook 上的Rudimentary Database Engine食谱。它包含了很多类,以方便您对SQL引擎的期望。

  • 数据库用于创建没有事务支持的数据库实例。
  • Database2 继承自数据库并提供表格事务。
  • 实现数据库表以及各种可能的交互。

其他几个类充当实用程序来支持通常支持的某些数据库操作。

  • NotLike 实施其他引擎中的 LIKE 运算符。
  • 日期日期时间是可用于数据库列的特殊数据类型。
  • DatePart MID FORMAT 允许在某些情况下选择信息。

除了类之外,还有 JOIN 操作的功能以及测试/演示。

答案 2 :(得分:0)

这在内置sqllite模块中全部免费提供。 sqllite的提交和回滚将比我理解here

更详细地讨论