译自 Palash Bauri 的文章:How to write a simple toy database in Python within minutes

文章地址:https://medium.freecodecamp.org/how-to-write-a-simple-toy-database-in-python-within-minutes-51ff49f47f1

MySQL,PostgreSQL,Oracle,Redis 或任何其他你能想到的数据库名称–数据库是人类文明进程中十分重要的部分科技技术。在今日,数据的重要性不言而喻,因此,数据库成了保证数据的安全和稳定性的重要手段。

可以看到数据库也是同等重要的。曾好几次,我希望为了理解,把玩而创造属于我自己的玩具数据库。正如理查德 · 费曼所说:

我无法理解我所不可创造之物

废话不多说,让我们进入正题:Coding!

开始 Coding 吧。。。

我选用 Python (我的最爱 ❤️)来创建这个玩具数据库,命名为 FooBarDB (应该没有更适合的名字了 😉 ),不过你可以随意起个喜欢的名字。

首先引入一些已经在 Python 标准库里的重要库:

1
2
import json
import os

没错,我们只需要这两个库!json 库是因为我们的数据库基于 JSON,os 库是用于处理路径问题。

下面开始定义基本的类库 FoobarDB,还有一些基本功能,后面会逐一解释。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class FoobarDB(object):
    def __init__(self , location):
        self.location = os.path.expanduser(location)
        self.load(self.location)

    def load(self , location):
        if os.path.exists(location):
            self._load()
        else:
            self.db = {}
        return True

    def _load(self):
        self.db = json.load(open(self.location , "r"))

    def dumpdb(self):
        try:
            json.dump(self.db , open(self.location, "w+"))
            return True
        except:
            return False

我们使用 __init__ 函数定义主类。创建一个 Foobar 数据库只需要传入数据库的位置。在 __init__ 函数中传入 location 参数,并使用用户的家目录替换 ~~user 。然后,使用 self.location 变量接受 location 参数,并在稍后的函数中使用它。最后,将 self.location 传入 load 函数。

1
2
3
4
5
6
7
8
. . . .
    def load(self , location):
        if os.path.exists(location):
            self._load()
        else:
            self.db = {}
        return True
. . . .

load 函数接受数据库位置参数,并检查数据库文件是否存在。如果存在,调用 _load() 函数(稍后解释)。否则,在内存中创建空的 JSON 对象。最后,返回 True 表示成功。

1
2
3
4
5
. . . . 

    def _load(self):
        self.db = json.load(open(self.location , "r"))
. . . .

调用 _load() 函数,从存储在 self.location 变量中的数据库位置打开数据库文件,将其转换为 JSON 对象,并载入 self.db 变量。

1
2
3
4
5
6
7
8
9
. . . .
    def dumpdb(self):
        try:
            json.dump(self.db , open(self.location, "w+"))
            return True
        except:
            return False

. . . .

最后,显而易见的,函数 dumpdb 从变量 self.db 接受内存中的数据库(实际上为 JSON 对象),并将其保存在数据库文件中。若成功,返回 True,否则,返回 False

让它更具实用性。。。😉

我们说了一大通,但是一个不能存储和读取的数据库应该没啥用吧,不是吗?😑 那就让我们把这些功能加上吧!😎

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
. . . .
    def set(self , key , value):
        try:
            self.db[str(key)] = value
            self.dumpdb()
            return True
        except Exception as e:
            print("[X] Error Saving Values to Database : " + str(e))
            return False

    def get(self , key):
        try:
            return self.db[key]
        except KeyError:
            print("No Value Can Be Found for " + str(key))  
            return False

    def delete(self , key):
        if not key in self.db:
            return False
        del self.db[key]
        self.dumpdb()
        return True
. . . .

set 函数负责添加数据。因为我们的数据库属于键-值数据库,所以只需要接收 keyvalue 参数即可。

首先,我们尝试将键-值对添加到数据库中并保存。如果进展顺利便返回 True。否则,打印错误信息并返回 False。(我们可不想一发生错误整个程序就崩溃)

1
2
3
4
5
6
7
. . . .
    def get(self, key):
        try:
            return self.db[key]
        except KeyError:
            return False
. . . .

get 是个简单函数,接受 key 参数并从数据库中返回关联的值。否则返回带有错误信息的 False。

1
2
3
4
5
6
7
8
9
. . . .
    def delete(self , key):
        if not key in self.db:
            return False
        del self.db[key]
        self.dumpdb()
        return True

. . . .

delete 函数用于从数据库中删除键-值对。首先,确保键-值对存在于数据库中,否则返回 False。然后,我们使用 Python 的内置功能 del 来删除键,同时与之关联的值也会自动删除。最后,保存数据库并返回 True。

你也许会想到,万一我创建的数据库规模很大,那么该怎么重置数据库呢?理论上,我们可以用 delete 函数,但是这并不可取且十分费时。⌛ 我们需要一个新函数来完成这项工作。

1
2
3
4
5
6
7
. . . . 

    def resetdb(self):
        self.db={}
        self.dumpdb()
        return True
. . . .

resetdb 函数闪亮登场!它很简单:首先,在内存中重新创建一个 JSON 对象,然后,保存它!没了!我们的数据库现在焕然一新。

最后。。。🎉

我们完成啦朋友们!我们创造了自己的玩具数据库!🎉 🎉 事实上,FoobarDB 仅仅只是一个数据库的雏形。它就像一件简陋的DIY:你可以根据自身需要,自由再创作。

完整代码在这里 👉 bauripalash/foobardb

我希望你能享受这个过程。在下方的评论区留下你的建议,意见或是勘误吧!👇

你还可以在这些地方找到我 👉 Facebook, Twitter, Instagram

期待我们能再次相见!