gpt4 book ai didi

python - 如何在Python中实现数据库风格的表格

转载 作者:太空狗 更新时间:2023-10-30 00:08:31 24 4
gpt4 key购买 nike

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

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

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

什么是好的数据结构?


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

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

  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 对真实世界的数据进行基准测试。

关于python - 如何在Python中实现数据库风格的表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4188202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com