【问题标题】:How to see the internal content of an index?如何查看索引的内部内容?
【发布时间】:2021-04-01 22:04:40
【问题描述】:

在value 列上创建索引时:

import sqlite3
db = sqlite3.connect(':memory:')
db.execute("CREATE TABLE data(id INTEGER PRIMARY KEY, value TEXT);")
db.execute("CREATE INDEX data_idx ON data(value);")
for v in ["xyz", "abc", "def", "abc", "ijk"]:
    db.execute("INSERT INTO data(value) VALUES (?)", (v,))

如何显示索引的内部内容?出于学习目的,以及在更复杂的情况下,查看索引中准确存储的内容会很有帮助。

由于data_idx 不是真正的表,因此no such table: data_idx 失败:

db.execute("SELECT * FROM data_idx")

如何显示一个Sqlite索引的内部内容? (我猜它应该是排序值和rowids 之间的对应关系?)

【问题讨论】:

  • 也许首先阅读SQLITE_MASTER 以检测索引中有哪些字段,然后计算第二个查询以收集结果?
  • @tgrandje "SELECT * FROM sqlite_master WHERE type = 'index';" 给出了('index', 'data_idx', 'data', 3, 'CREATE INDEX data_idx ON data(value)'),但是我想看看索引里面的内部内容:项目应该是排序的,看看匹配的rowids 等等。

标签: python database sqlite indexing


【解决方案1】:

使用https://sqlite.org/imposter.html,我们可以创建一个与索引共享相同数据的“冒名顶替”表。然后我们可以显示这个表的内容,即索引的内容。

警告(来自文档):

Imposter 表仅用于分析和调试。这是 不是大多数应用程序开发人员应该理解或 甚至知道。冒名顶替者表仅供专家使用。使用不当 冒名顶替者表可能导致索引损坏,尽管任何损坏 以这种方式创建的可以通过运行 REINDEX 来修复。

import sqlite3
db = sqlite3.connect('index.db')
db.executescript("""
CREATE TABLE data(id INTEGER PRIMARY KEY, value TEXT); 
CREATE INDEX data_idx ON data(value);
INSERT INTO data(value) VALUES('xyz'), 
                              ('abc'), 
                              ('def'),
                              ('abc'),
                              ('ijk');

PRAGMA writable_schema=ON;
INSERT INTO sqlite_master(type, name, tbl_name, rootpage, sql)
     VALUES('table', 'data_idx_2', 'data_idx_2', (SELECT rootpage FROM sqlite_master WHERE name='data_idx'),
            'CREATE TABLE data_idx_2(value, id, PRIMARY KEY(value, id)) WITHOUT ROWID')
""")
db.commit()
db.close()  # required to close / open, see documentation
db = sqlite3.connect('index.db')
for r in db.execute("SELECT * FROM data_idx_2"):
    print(r)

那么,这就是索引的内容:

('abc', 2)
('abc', 4)
('def', 3)
('ijk', 5)
('xyz', 1)    

【讨论】:

  • 好主意!随时使用此信息@tgrandje 编辑答案!
猜你喜欢
  • 2013-01-12
  • 2011-03-28
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 2011-10-25
  • 2011-01-21
相关资源
最近更新 更多