如何在Python中实现数据库样式表

时间:2010-11-15 19:48:28

标签: python performance data-structures implementation

我正在实现一个类似于典型数据库表的类:

  • 已命名列和未命名的行
  • 有一个主键,我可以通过它来引用行
  • 支持按主键和列标题检索和分配
  • 可以被要求为任何列添加唯一或非唯一索引,允许快速检索在该列中具有给定值的行(或行集)
  • 删除行很快并且实现为“软删除”:行是物理保留的,但标记为删除,并且不会显示在任何后续检索操作中
  • 添加列很快
  • 很少添加行
  • 列很少被删除

我决定直接实现该类,而不是使用sqlite的包装器。

使用什么样的好数据结构?


正如一个例子,我正在考虑的一种方法是字典。它的键是表的主键列中的值;它的值是以下列方式之一实现的行:

  1. 作为清单。列号被映射到列标题中(使用一个方向的列表和另一个方向的映射)。这里,检索操作首先将列标题转换为列号,然后在列表中找到相应的元素。

  2. 作为词典。列标题是这本词典的关键。

  3. 不确定两者的利弊。


    我想编写自己的代码的原因是:

    • 我需要跟踪行删除。也就是说,在任何时候我都希望能够报告哪些行被删除以及哪些“原因”(“原因”传递给我的删除方法)。
    • 我需要在索引编制期间进行一些报告(例如,在构建非唯一索引时,我想检查某些条件并报告它们是否被违反)

3 个答案:

答案 0 :(得分:2)

我会考虑使用作为元组或列表的键来构建字典。例如:my_dict(("col_2", "row_24"))会得到这个元素。从那里开始,对于非常大的数据库来说,编写'get_col'和'get_row'方法以及前面两个方法中的'get_row_slice'和'get_col_slice'来获取对你的访问权限将非常容易方法

使用像这样的完整字典将有2个优点。 1)获得单个元素将比您提出的2个方法更快; 2)如果你想在列中有不同数量的元素(或缺少元素),这将使它非常容易和内存效率。

只是一个想法:)我很想知道人们会建议什么包!

干杯

答案 1 :(得分:2)

您可能需要考虑创建一个使用内存中sqlite表的类:

import sqlite3

class MyTable(object):
    def __init__(self):
        self.conn=sqlite3.connect(':memory:')
        self.cursor=self.conn.cursor()
        sql='''\
            CREATE TABLE foo ...
        '''
        self.execute(sql)
    def execute(self,sql,args):
        self.cursor.execute(sql,args)
    def delete(self,id,reason):
        sql='UPDATE table SET softdelete = 1, reason = %s where tableid = %s'
        self.cursor.execute(sql,(reason,id,))
    def verify(self):
        # Check that certain conditions are true
        # Report (or raise exception?) if violated
    def build_index(self):
        self.verify()
        ... 

软删除可以通过softdelete列(bool类型)来实现。 同样,您可以使用列来存储删除原因。 取消删除只会涉及更新行并更改softdelete值。 使用SQL条件WHERE softdelete != 1可以选择尚未删除的行。

您可以编写verify方法来验证数据的条件是否满足。您可以在build_index方法中调用该方法。

另一种选择是使用numpy结构化蒙版数组。

很难说最快的是什么。也许唯一确定的方法是为每个编写代码并使用timeit对真实数据进行基准测试。

答案 2 :(得分:0)

你真的应该使用SQLite。

出于第一个原因(跟踪删除原因),您可以通过在删除时“移动”行的第二个表来轻松实现此目的。可以在该表中的其他列或您可以加入的其他表中跟踪原因。如果并不总是需要删除原因,那么您甚至可以在源表上使用触发器来复制即将删除的行,和/或具有可以解释原因的用户定义函数。

索引原因在某种程度上受到约束等的影响,但我无法在没有更多细节的情况下直接解决它。