我正在实现一个类似于典型数据库表的类:
我决定直接实现该类,而不是使用sqlite的包装器。
使用什么样的好数据结构?
正如一个例子,我正在考虑的一种方法是字典。它的键是表的主键列中的值;它的值是以下列方式之一实现的行:
作为清单。列号被映射到列标题中(使用一个方向的列表和另一个方向的映射)。这里,检索操作首先将列标题转换为列号,然后在列表中找到相应的元素。
作为词典。列标题是这本词典的关键。
不确定两者的利弊。
我想编写自己的代码的原因是:
答案 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。
出于第一个原因(跟踪删除原因),您可以通过在删除时“移动”行的第二个表来轻松实现此目的。可以在该表中的其他列或您可以加入的其他表中跟踪原因。如果并不总是需要删除原因,那么您甚至可以在源表上使用触发器来复制即将删除的行,和/或具有可以解释原因的用户定义函数。
索引原因在某种程度上受到约束等的影响,但我无法在没有更多细节的情况下直接解决它。