从 PersistEntity/PersistField 映射到 DB 中的列名和表名的规则是啥
Posted
技术标签:
【中文标题】从 PersistEntity/PersistField 映射到 DB 中的列名和表名的规则是啥【英文标题】:What are the rules of mapping from PersistEntity/PersistField to column and table names in the DB从 PersistEntity/PersistField 映射到 DB 中的列名和表名的规则是什么 【发布时间】:2012-05-03 09:45:07 【问题描述】:我需要使用现有的 (mysql) 数据库,其中表和列的名称已经定义。
如果我正确理解了文档(并且我没有找到关于此主题的好的文档,因此非常感谢链接),表名与 PersistIdentity 相关,因此必须以大写字母开头(这不是我面临的情况)。
但是,列名自动不大写(至少在 Yesod 书 Persistent 章节中,在描述从声明自动生成的代码的代码 sn-p 中暗示了这一点),因此 DB 中的列必须以开头用小写字母。
上面的描述是真的吗?
我可以具体控制表到标识和列到字段的映射吗? 如果不是,那么命名自动应用的规则是什么?因此禁止使用哪些名称?
此外,其中一个字段是 VARCHAR(30)。我如何将其传达给 Persistent?它目前抱怨(通过 yesod devel):
errMessage = "BLOB/TEXT 列 'my_field' 用于密钥规范,没有密钥长度"
这是自动迁移的结果(我可能无论如何都应该禁用它)。但是,如果我确实想声明一个有界 VARCHAR 字段 - 我可以通过 Persistent 及其自动迁移工具来做到这一点吗?
谢谢,
【问题讨论】:
【参考方案1】:我不是 MySQL 后端的权威,但是 IIRC(并且基于代码),您可以通过使用 maxlen=...
属性来控制最大长度。同样,您可以使用sql=...
属性直接控制该字段在数据库中的名称。因此,例如,以下可能会起作用:
Person sql=people
name Text sql=full_name maxlen=40
age Int
我也同意,如果您正在处理预先存在的架构,则应该禁用自动迁移代码。
【讨论】:
谢谢,我还看到 Persistent 的文档(在 Yesod 书中)确实回答了我的部分问题(关于使用 sql 指定字段名称),很抱歉那部分的冗余。以上是关于从 PersistEntity/PersistField 映射到 DB 中的列名和表名的规则是啥的主要内容,如果未能解决你的问题,请参考以下文章