使用go migrate执行PostgreSQL迁移遇语法错误求助
PostgreSQL迁移语法错误问题解答
1. 语法错误的原因
user是PostgreSQL的保留关键字,直接将它作为表名使用会触发语法解析错误。PostgreSQL会把保留关键字当作SQL命令的一部分处理,而非用户自定义的标识符。
修正后的SQL有两种可行方式:
方式一:修改表名(推荐)
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE TABLE users ( id UUID DEFAULT uuid_generate_v4 () PRIMARY KEY, email TEXT NOT NULL UNIQUE, password TEXT NOT NULL, created_at TIMESTAMP without time zone NOT NULL DEFAULT NOW(), updated_at TIMESTAMP without time zone );
方式二:用双引号包裹保留关键字
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE TABLE "user" ( id UUID DEFAULT uuid_generate_v4 () PRIMARY KEY, email TEXT NOT NULL UNIQUE, password TEXT NOT NULL, created_at TIMESTAMP without time zone NOT NULL DEFAULT NOW(), updated_at TIMESTAMP without time zone );
注意:用双引号包裹后,标识符会区分大小写,后续查询该表时必须同样用双引号引用。
2. 同类问题的调试方法
- 核对PostgreSQL保留关键字:PostgreSQL有明确的保留、非保留关键字列表,编写SQL前确认自定义标识符不在保留关键字范围内
- 用psql直接测试:将迁移文件中的SQL片段复制到psql命令行执行,能得到比在线工具更精准的错误定位和提示
- 开启数据库详细日志:修改PostgreSQL配置文件
postgresql.conf,设置log_statement = 'all',执行迁移后查看日志,获取完整的错误上下文 - 优先避免关键字命名:尽量使用语义清晰且非关键字的名称,比如用
users代替user,减少不必要的语法冲突 - 拆分测试SQL片段:如果迁移文件内容较多,拆分语句逐个执行,快速定位出错的具体代码行
内容的提问来源于stack exchange,提问作者siva
相关产品推荐
相关产品推荐

