2012-07-20 85 views
1

我想迁移我的sqlite3数据库到Postgresql(我遵循Railscasts#342,但我在Ubuntu上)。 我aperitime_development数据库rake db:create:all后,我开始用水龙头一西纳特拉服务器(推英里sqlite3的DB),但是当我尝试做Sqlite3到Postgresql迁移通过水龙头上的错误

taps pull postgres://willy:[email protected]/aperitime_development http://willy:[email protected]:5000' 

的的数据都是不可复制的Postgres的数据库和控制台不会终止正确:

Receiving schema 
Schema:   0% |           | ETA: --:--:-- 
Schema:   25% |==========        | ETA: 00:00:07 
Schema:   50% |=====================      | ETA: 00:00:03 
Schema:   75% |===============================   | ETA: 00:00:01 
Schema:  100% |==========================================| Time: 00:00:04 
Receiving data 
4 tables, 800 records 
/usr/lib/ruby/gems/1.9.1/gems/sequel-3.20.0/lib/sequel/adapters/postgres.rb:175:in 'async_exec': PG::Error: ERROR: integer out of range (Sequel::DatabaseError) 
from /usr/lib/ruby/gems/1.9.1/gems/sequel-3.20.0/lib/sequel/adapters/postgres.rb:175:in `block (2 levels) in execute' 
from /usr/lib/ruby/gems/1.9.1/gems/sequel-3.20.0/lib/sequel/database/logging.rb:28:in `log_yield' 
from /usr/lib/ruby/gems/1.9.1/gems/sequel-3.20.0/lib/sequel/adapters/postgres.rb:175:in `block in execute' 
from /usr/lib/ruby/gems/1.9.1/gems/sequel-3.20.0/lib/sequel/adapters/postgres.rb:158:in `check_disconnect_errors' 
from /usr/lib/ruby/gems/1.9.1/gems/sequel-3.20.0/lib/sequel/adapters/postgres.rb:175:in `execute' 

和erros继续。

有什么想法?

这是我的database.yml

development: 
adapter: postgresql 
encoding: unicode 
database: aperitime_development 
pool: 5 
username: willy 
password: piero 

test: 
adapter: postgresql 
encoding: unicode 
database: aperitime_test 
pool: 5 
username: willy 
password: piero 

这里是我的schema.rb

ActiveRecord::Schema.define(:version => 20120630154954) do 

create_table "locals", :force => true do |t| 
t.string "nome" 
t.string "indirizzo" 
t.text  "descrizione" 
t.integer "Tel", :limit => 8 
t.integer "voto" 
t.string "mappa" 
t.datetime "created_at", :null => false 
t.datetime "updated_at", :null => false 
end 

create_table "users", :force => true do |t| 
t.string "nome" 
t.string "email" 
t.datetime "created_at",       :null => false 
t.datetime "updated_at",       :null => false 
t.string "password_digest" 
t.string "remember_token" 
t.boolean "admin",   :default => false 
end 

add_index "users", ["email"], :name => "index_users_on_email", :unique => true 
add_index "users", ["remember_token"], :name => "index_users_on_remember_token" 

end 
+1

它似乎是插入数据到一个整数字段溢出它?您是否比较了Postgresql DB的模式以及您尝试插入的值以查看是否超出范围。 – Doon 2012-07-20 14:18:47

+0

在某些情况下,我插入了一些电话号码,他们可能是这些奇怪的值?我如何改变它们? – bugman 2012-07-20 14:26:07

+0

是电话号码?它应该是一个整数吗?字符串不会更好吗? – Doon 2012-07-20 14:46:14

回答

1

的电话列设置为整数,你的一些数据都满溢PostgreSQL的整数类型通常我看到的电话号码被作为字符串存储在数据库中。因为在某些时候你可能需要一个扩展或类似的东西,它不会像int那样工作。

要将现有表从整数更改为posgresql中变化的字符,请使用以下命令创建迁移。

def up 
    execute <<-SQL 
     ALTER TABLE locals ALTER COLUMN Tel type character varying(255) 
    SQL 
end 

这应该将列类型更改为rails默认字符串表示形式。它也应该转换现有的整数。但一定要测试。

+0

好的,我明白我的错误的原因,但是你能更具体地说明我必须做什么步骤吗?只是轨道克移民和? 谢谢 – bugman 2012-07-20 15:46:52

+0

我现在创建了正确的迁移“Tel”是一个字符串,但错误仍然是相同的,不幸的是 – bugman 2012-07-20 19:48:47

+0

你能找出导致错误的确切记录吗?并查看这些值,并将它们与表模式匹配?或者是否有更多的调试信息可以让你获得关于pgsql抱怨的声明的更多信息。 – Doon 2012-07-21 18:21:52

1

这里的魔法咒语在迁移时声明 柱:

create_table :example do |t|   
t.integer :field, :limit => 8 
end 

:上限=> 8在这种情况下,Postgres的不仅签署 4字节的整数时,你刚才说的整数魔力。这使用8字节签名的 整数。

保罗鲁贝尔

+0

所以我该怎么办?我必须在schema.rb中添加限制=>? – bugman 2012-07-20 14:30:15