1

最初我的模型上的坐标字段使用整数,但是当我尝试部署到 Heroku 时,我被提醒(通过崩溃)我需要它是一个浮点数(因为我的坐标中有小数点)。所以我在我的本地机器上生成了一个 change_column 迁移,以将它们 change_column 改为浮点数。一切顺利。

我尝试再次部署到 heroku,首先使用 a heroku pg:reset,然后使用heroku db:setup. 在 db:setup 期间,我收到以下错误:

PGError: ERROR: precision for type float must be less than 54 bits : CREATE TABLE "landmarks" ("id" serial primary key, "name" character varying(255), "xcoord" float(255), "ycoord" float(255), "created_at" timestamp, "updated_at" timestamp)

所以我生成了另一个 change_column 迁移,这次也使用 :precision 选项(设置为:precision => 50,小于 54)。我再次经历了整个部署过程,它给了我同样的错误。

难道我做错了什么?在使用 float 之前,我已经将另一个应用程序部署到 Heroku,没有任何修改......

我在本地机器上使用 SQLite,我认为 Heroku 使用 Postgres?

提前致谢!

[编辑:我还应该提到,在我更改:precision坐标值后显示的错误输出 SQL 仍然显示'float(255)'......不知道为什么]

4

2 回答 2

3

不要使用 float(255) 作为列类型。使用realdouble precision。请阅读http://www.postgresql.org/docs/8.3/static/datatype-numeric.html#DATATYPE-FLOAT

此外,我们强烈建议在本地使用 postgres 进行开发。在开发和生产之间大幅切换堆栈的重要部分时,经常会遇到不一致的情况——例如这种情况。您的数据库是堆栈的重要组成部分。

于 2012-01-26T23:19:34.060 回答
1

我认为 Postgres 抱怨的是位和数字之间的差异——精度为 50 位的东西的位数远远超过 50 位。换句话说,2^53 = 9,007,199,254,740,992,或 16 位有效数字的准确度。尝试将其设置为:scale => 12, :precision => 15- 这应该让您在小数点前三位数字,在小数点之后获得 12 位数字,我相信这会将您置于 53 位限制之下。

于 2012-01-26T05:58:37.680 回答