i使用/有助于Haskell库(持久)生成Postgres的迁移。图书馆通过读取Haskell数据类型来工作,然后生成与这些类型相匹配的适当表。
它通过查看基于Haskell类型的数据库架构的预期(即,名为Settings
的HASKELL记录都意味着应该创建一个表名为settings
),然后将其与Postgres中的内容进行比较(如果没有名称settings
,它将执行迁移以创建该表)。
不幸的是,当Postgres截断标识符的标识符以63个字符为单位时,这并不能很好地工作。给定一些SQL喜欢:
CREATE TABLE an_extremely_fantastically_super_long_name_child(an_extremely_fantastically_super_long_name_parent_id INTEGER NOT NULL REFERENCES an_extremely_fantastically_super_long_name_parent);
CREATE TABLE my_massively_huge_biggest_child_table (biggest_ever_column_name_that_will_reference_a_parent INTEGER NOT NULL REFERENCES an_extremely_fantastically_super_long_name_parent);
它将产生一个名为my_massively_huge_biggest_chi_biggest_ever_column_name_tha_fkey
的外键约束(删除表名的一部分和列名称的一部分并添加_fkey
)。
我可以使Haskell库截断它想要创建的所有标识符,以解决63个字符,这将解决问题。但是,我想与Postgres使用REFERENCES
语法时生成的内容保持兼容性。为此,我需要复制Postgres中使用的算法。这是什么算法?我试图在Postgres源代码中搜索它,但是由于Postgres是一个非常庞大的项目,因此很难找到。
我认为,如果我给出了足够的示例数据,我可以算出确切的公式,但是也只能查看源代码。
~postgresql/src/backend/commands/indexcmds.c
行#2000之后:ChooseIndexName()
和朋友。
[这是针对索引,但是该方法对于其他生成的名称相似]