【发布时间】: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