我假设发生了什么......想问社区。 p>
我最近的迁移是根据Heroku上PG的要求将电话号码从integer
更改为bigint
。我的模式文件更新以反映最新的迁移(如在日期匹配中),仍显示:
t.integer "phone"
因此,当我运行rake db:reset
时,手机仍然是integer
,这对于Heroku中的PG来说是一个问题因为我发现错误,因为integer
不支持我需要它的价值。
这可能只是反映了我的开发数据库sqlite使用integer
作为bigint
每个文件? http://www.sqlite.org/datatype3
我问这只是为了确保数据库的其余部分是一致的......我并不是有点偏执,以某种方式错过了一堆其他迁移。
另一件事是,如果我的假设是正确的,那么我如何强制bigint作为模式中的定义来避免将来发生这样的事情?是唯一的方法使本地数据库也PG?
谢谢!
答案 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