全栈工程师成长记

编程重新定义人生

部署 Rails 项目到 heroku 的时候请注意 sqlite3 和 postgresql 的区别

在部署 jdstore 项目到 heroku 的时候,运行 heroku run rake db:migrate 会报错,

PG::UndefinedTable: ERROR: relation "orders" does not exist
: ALTER TABLE "orders" ADD "token" character varying

上述错误是说 orders 这个表格并没有存在,因此无法执行 add_column 把 token 栏位加入 orders 。

这个问题导致部署之后可以进入 jdstore 首页,但是点击 My orders 菜单查看订单纪录的时候再次报错。

在stack overflow上面倒是能查到相关问题的结果,但是十个单词认识四、五个,只能看懂个大概,不能照搬答案呐,只好硬着头皮自己来了,在没有尝试自行解决之前就不要问别人了。

经排查原因在于建立 table 的顺序出现了错误,在本地的 db 文件夹里,add token to orders 这个 migration 的时间顺序排在了 create orders table 这个 migration 之上,在执行 migrate 的时候会按照时间先后顺序执行,这个顺序在本机开发环境使用的 sqlite3 里不会存在问题,但是在 heroku 环境的 postgresql 里则会非常严格检查每一次 migration 的时候是否会有相应的表格存在,因此会出现报错。

解决的办法是删除之前的 add token migration,然后重新产生一个时间排序在最后的 migration 。但是还有可能产生的问题是,现在排在上面的 create orders table 里已经存在 token 栏位,那么再次 migrate 的时候会提示:

PG::DuplicateColumn: ERROR: column "token" of relation "orders" already exists
: ALTER TABLE "orders" ADD "token" character varying

所以就需要删除这个新产生的多余 add token migration。

总结起来就是,先看 create table 里面已经有哪些栏位了?各个栏位参数是否正确?如果已经存在栏位且参数正确,在 create table 后面的那些 add column 、 rename column 都不能留着,直接删除掉。

正如 xdite 老师在 Hackthon 的课程里所讲,先在第一时间部署项目,不要到最后的时候部署发现问题了再说“在我的电脑上可以运行啊”之类的笑话。