我有一张表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)
答案 0 :(得分:1)
问题是我试图插入的指纹值太长而不能成为索引(主键或其他)。解决方案是将完整指纹插入到没有唯一约束的普通列中,然后使用我的OP中的代码计算主键track_hash
的md5哈希值。