Rake db:reset没有更新从integer到bigint的更改; Sqlite支持bigint?

时间:2015-03-12 21:22:39

标签: ruby-on-rails database sqlite postgresql heroku

我假设发生了什么......想问社区。

我最近的迁移是根据Heroku上PG的要求将电话号码从integer更改为bigint。我的模式文件更新以反映最新的迁移(如在日期匹配中),仍显示:

t.integer "phone"

因此,当我运行rake db:reset时,手机仍然是integer,这对于Heroku中的PG来说是一个问题因为我发现错误,因为integer不支持我需要它的价值。

这可能只是反映了我的开发数据库sqlite使用integer作为bigint每个文件? http://www.sqlite.org/datatype3

我问这只是为了确保数据库的其余部分是一致的......我并不是有点偏执,以某种方式错过了一堆其他迁移。

另一件事是,如果我的假设是正确的,那么我如何强制bigint作为模式中的定义来避免将来发生这样的事情?是唯一的方法使本地数据库也PG?

谢谢!

2 个答案:

答案 0 :(得分:0)

来自http://sqlite.org/datatype3.html

  

存储在SQLite数据库中(或由数据库引擎操纵)的每个值都具有以下存储类之一:

     
      
  • INTEGER。该值是有符号整数,存储为1,2,3,4,6或8个字节,具体取决于值的大小。
  •   

因此,假设您的绑定在适当的地方使用sqlite3_bind_int64,SQLite将无缝地支持64位整数。

答案 1 :(得分:0)

简而言之:电话号码是文字,而不是数字。 Rails比你更了解SQLite。如果您想要一致的行为,请在开发,测试和生产中使用PostgreSQL。

首先,SQL bigint是电话号码的错误数据类型。电话号码可以有前导零,但数字(包括bigints)不能。

其次,SQLite甚至没有拥有SQL意义上的数据类型。

sqlite>     create table test (
   ...>       test_id integer
   ...>     );
sqlite>     
sqlite>     insert into test values ('wibble');
sqlite>     select * from test;
test_id   
----------
wibble    

第三,您可以在SQLite中使用任何标记作为数据类型。什么都没有。想要一个名为“kate_mara”的“数据类型”吗?

sqlite> drop table test;
sqlite> create table test (
   ...>   n kate_mara
   ...> );
sqlite> insert into test values (42);
sqlite> select * from test;
n                   
--------------------
42                  
sqlite> .dump test
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test (
  n kate_mara
);
INSERT INTO "test" VALUES(42);
COMMIT;

第四,SQLite的整数存储类可以存储64位值。 (就此而言,kate_mara也可以。)

sqlite> drop table test;
sqlite> create table test (
   ...>   n integer
   ...> );
sqlite> insert into test values (0);
sqlite> insert into test values (2147483647); -- Biggest 32-bit int
sqlite> insert into test values (9223372036854775807); -- Biggest 64-bit int
sqlite> .width 20
sqlite> select * from test;
n                   
--------------------
0                   
2147483647          
9223372036854775807 

这是SQLite整数的上限。任何更高,它会切换到浮点数而不会出现错误或警告。

sqlite> update test set n = n + 1;
sqlite> select * from test;
n                   
--------------------
1                   
2147483648          
9.22337203685478e+18