我目前正在使用pqGo的lib 与我的 PostgreSQL 数据库进行通信。事实证明,错误检查比预期的要困难一些。描述我的问题的最简单方法是通过一个示例场景。
想象一个网络表单:
Username ________
Email ________
Voucher ________
Password ________
一个粗略的模式:
username VARCHAR(255) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
voucher VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL
暂时忽略假定的纯文本密码。如果有人提交表单,我可以进行所有验证以验证诸如长度/允许的字符/等约束。
现在要放到数据库中了,所以我们写一个准备好的语句并执行它。如果验证正确完成,唯一可能真正出错的是UNIQUE约束。如果有人试图输入现有的用户名,database/sql 将触发一个错误。
我的问题是我不知道如何处理该错误并从(应该是)可恢复的错误中恢复。pq对此提供了一些支持,但返回的内容似乎仍然存在歧义。
我可以看到两种解决方案,这两种解决方案对我来说都不是特别有吸引力:SERIALIZABLE在插入之前检查每个表单值的事务。或者,对 pq 错误结构进行某种形式的解析。
是否有实现这样一个系统的通用模式?我希望能够对用户说Sorry that username exists而不是Sorry something bad happened
作为旁注,PostgreSQL 文档指出:
模式名称、表名称、列名称、数据类型名称和约束名称的字段仅针对有限数量的错误类型提供;见 附录 A。
但是链接页面对于数据库对象中返回的值不是很有帮助。
幕布斯6054654
相关分类