从 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 中的列名和表名的规则是啥的主要内容,如果未能解决你的问题,请参考以下文章

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?

mysql 主-主-从-从