【问题标题】:Hashed primary key散列主键
【发布时间】:2015-08-16 23:15:35
【问题描述】:

我有一张表library,其中每一行代表一个音乐曲目。我想让主键成为轨道的音频指纹。不幸的是,当我尝试插入时,SQLAlchemy 传递给我一个 postgres 错误:

OperationalError: (psycopg2.OperationalError) 索引行大小 3384 超过索引“library_fingerprint_key”的最大值 2712
提示:大于缓冲区页面 1/3 的值不能被索引。
考虑值的 MD5 散列的函数索引,或使用全文索引。

我现在想将完整指纹存储为普通列,并创建一个散列版本作为主键。我已经尝试使用 SQLAlchemy 的 Context-Sensitive Default Functions 来解决这个问题,但我仍然收到上述错误消息。

有没有办法根据另一列(指纹列)自动散列主键?

下面的代码sn-p

def fingerprint_md5(context):
        return hashlib.md5(context.current_parameters['fingerprint']).hexdigest()

class Library(Base): tablename = 'library' track_hash = Column(String, primary_key=True, default=fingerprint_md5) fingerprint = Column(String, nullable=False, unique=True)

为索引 DDL 更新:

索引:
    "library_pkey" PRIMARY KEY, btree (track_hash)
    “library_fingerprint_key”唯一约束,btree(指纹)
    “library_path_key”唯一约束,btree(路径)

【问题讨论】:

  • 索引的 DDL 是什么?听起来它可能不仅仅包含哈希,因为如果它真的只索引 md5,我看不出索引行大小怎么可能是 3384。
  • 那个错误是由于试图插入原始指纹(不是它的哈希),这是一个很长的字母数字字符串。
  • 好的,但我认为这让我的问题变得更加重要——该索引的 DDL 是什么?看起来它可能试图索引的数量超出您的预期......
  • @khampson 我添加了索引信息,如果您有其他需要,请告诉我。

标签: python postgresql sqlalchemy


【解决方案1】:

问题是我尝试插入的指纹值太长而不能成为索引(主键或其他)。解决方案是将完整指纹插入到没有唯一约束的普通列中,然后使用我的 OP 中的代码计算主键 track_hash 的 md5 哈希。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2013-04-24
    • 2012-10-23
    • 2013-07-08
    • 2014-07-28
    相关资源
    最近更新 更多