使用golang-migrate执行PostgreSQL初始迁移返回‘no change’排查
以下是常见的几个原因及对应的排查步骤:
迁移文件命名不规范
golang-migrate对迁移文件的命名有严格要求,必须遵循[版本号]_[描述].up.sql格式(比如000001_create_users_table.up.sql)。如果文件名缺少.up.sql后缀、版本号不是数字开头或重复,工具会无法识别这些文件,直接判定没有需要执行的迁移。检查你的schema目录下的文件命名是否符合要求。迁移已被执行过
工具会在目标数据库中自动创建schema_migrations表,用来记录已执行的迁移版本。执行以下SQL查询确认:SELECT version FROM schema_migrations;如果你的迁移文件对应的版本号已经出现在结果中,说明这些迁移之前已经执行过,所以返回"no change"。如果是误执行,可以用
migrate down回滚后重新执行,或者删除对应版本记录后重试。路径指定错误
确认-path ./schema指向的目录确实存在迁移文件。比如实际文件可能在./schema/migrations子目录,或者你输入的路径是相对路径但当前工作目录不对。可以用绝对路径测试,比如-path /full/path/to/your/schema。数据库连接串指向错误
虽然没有报错,但有可能连接到了错误的数据库。先用psql验证连接是否正确:psql postgres://postgres:root@localhost:5432/to_do?sslmode=disable进入数据库后,检查是否存在
schema_migrations表以及目标表(users、todo_lists等)。如果连接到了其他数据库,自然不会执行迁移。迁移文件内容无效
检查.up.sql文件是否为空,或者SQL语句是否存在语法问题。虽然大部分语法错误会触发报错,但某些情况下(比如语句不完整)可能不会报错,导致工具认为迁移已执行但实际未创建表。可以直接在psql中执行文件里的SQL语句,验证是否能正常创建表。
内容的提问来源于stack exchange,提问作者Aaaaaaaaa Aaaaaaaaa

