哈希主键

时间:2015-08-16 23:15:36

标签: python postgresql sqlalchemy

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

OperationalError: (psycopg2.OperationalError) index row size 3384 exceeds maximum 2712 for index "library_fingerprint_key"
HINT:  Values larger than 1/3 of a buffer page cannot be indexed.
Consider a function index of an MD5 hash of the value, or use full text indexing.

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

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

下面的代码段

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:

Indexes:
    "library_pkey" PRIMARY KEY, btree (track_hash)
    "library_fingerprint_key" UNIQUE CONSTRAINT, btree (fingerprint)
    "library_path_key" UNIQUE CONSTRAINT, btree (path)

1 个答案:

答案 0 :(得分:1)

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