2013-07-03 79 views
0

我正在嘗試使用rufus-scheduler gem和salesforcebulk gem定期導入數據到rails。使用批量API將Salesforce數據導入Rails時的編碼問題

我已經成功地導入從一個Salesforce的自定義對象的數據到我的數據庫,但是當我嘗試導入其它對象我遇到麻煩:

scheduler caught exception: 
Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8: INSERT INTO "channels" ("created_at", "name", "updated_at") VALUES (?, ?, ?) 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/sqlite_adapter.rb:208:in `encode' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/sqlite_adapter.rb:208:in `type_cast' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/sqlite_adapter.rb:259:in `block (2 levels) in exec_query' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/sqlite_adapter.rb:258:in `map' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/sqlite_adapter.rb:258:in `block in exec_query' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activesupport-3.2.13/lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/sqlite_adapter.rb:242:in `exec_query' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/database_statements.rb:63:in `exec_insert' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/database_statements.rb:90:in `insert' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/query_cache.rb:14:in `insert' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/relation.rb:66:in `insert' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/persistence.rb:367:in `create' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/timestamp.rb:58:in `create' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/callbacks.rb:268:in `block in create' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:403:in `_run__3666243914465906250__create__2439689705720496844__callbacks' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:405:in `__run_callback' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:385:in `_run_create_callbacks' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:81:in `run_callbacks' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/callbacks.rb:268:in `create' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/persistence.rb:348:in `create_or_update' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/callbacks.rb:264:in `block in create_or_update' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:414:in `_run__3666243914465906250__save__2439689705720496844__callbacks' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:405:in `__run_callback' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:385:in `_run_save_callbacks' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:81:in `run_callbacks' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/callbacks.rb:264:in `create_or_update' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/persistence.rb:84:in `save' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/validations.rb:50:in `save' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/attribute_methods/dirty.rb:22:in `save' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/transactions.rb:259:in `block (2 levels) in save' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/transactions.rb:208:in `transaction' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/transactions.rb:311:in `with_transaction_returning_status' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/transactions.rb:259:in `block in save' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/transactions.rb:270:in `rollback_active_record_state!' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/transactions.rb:258:in `save' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/relation/finder_methods.rb:296:in `find_or_instantiator_by_attributes' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/activerecord-3.2.13/lib/active_record/dynamic_matchers.rb:52:in `method_missing' 
/Users/arturodiaz/Drive/Code/partnerportal2/agripa/config/initializers/task_scheduler.rb:121:in `block (2 levels) in <top (required)>' 
/Users/arturodiaz/Drive/Code/partnerportal2/agripa/config/initializers/task_scheduler.rb:120:in `each' 
/Users/arturodiaz/Drive/Code/partnerportal2/agripa/config/initializers/task_scheduler.rb:120:in `block in <top (required)>' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/rufus-scheduler-2.0.19/lib/rufus/sc/jobs.rb:231:in `call' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/rufus-scheduler-2.0.19/lib/rufus/sc/jobs.rb:231:in `trigger_block' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/rufus-scheduler-2.0.19/lib/rufus/sc/jobs.rb:191:in `block in trigger' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/rufus-scheduler-2.0.19/lib/rufus/sc/scheduler.rb:415:in `call' 
/Users/arturodiaz/.rvm/gems/[email protected]/gems/rufus-scheduler-2.0.19/lib/rufus/sc/scheduler.rb:415:in `block in trigger_job' 
================================================================================ 

這裏是對象的代碼是成功的檢索和輸入:

scheduler.at("2013-07-03 11:17:15 -0700 ") do 

    client = SalesforceBulk::Client.new(username: 'XXXXXXXXX', password: 'XXXXXXXXX') 
    client.authenticate 

    job = client.add_job(:query, :Paquete__c) 

    batch = client.add_batch(job.id, "SELECT Id, Name, Capacidad__c, Organizacion__c FROM Paquete__c") 

    job = client.close_job(job.id) 

    sleep 5.0 

    batch = client.batch_info(job.id, batch.id) 

    results = client.batch_result(job.id, batch.id) 

    results.each do |d| 
    Paquete.find_or_create_by_serie_and_id_and_version(id: d[:Id], 
                  serie: d[:Name], 
                  account_id: d[:Organizacion__c], 
                  capacidad: d[:Capacidad__c]) 
    end 

    puts "Done... Paquetes" 

end 

這裏是不工作的代碼:

scheduler.at("2013-07-03 11:40:00 -0700 ") do 

client = SalesforceBulk::Client.new(username: 'XXXXXXXXXXXX', password: 'XXXXXXXXXXX') 
client.authenticate 

job = client.add_job(:query, :Account) 

batch = client.add_batch(job.id, "SELECT Id, Name, Type FROM Account") 
job = client.close_job(job.id) 

sleep 5.0 

batch = client.batch_info(job.id, batch.id) 

results = client.batch_result(job.id, batch.id) 

results.each do |d| 
Account.find_or_create_by_id_and_name(id: d[:Id], name: d[:Name],type: d[:Type])                 

end 

puts "Done... Accounts" 

end 

我已經嘗試更改salesforcebulk gem的batch_result方法內的CSV解析器中的編碼,但沒有成功。

我覺得很奇怪,一段代碼正在工作,另一段沒有。也許這是關於某個桌子的事情。

回答

0

你應該專注於錯誤:

Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8: 
INSERT INTO "channels" ("created_at", "name", "updated_at") VALUES (?, ?, ?) 

/Users/arturodiaz/.rvm/gems/[email protected]/gems/ 
activerecord-3.2.13/lib/active_record/connection_adapters/ 
sqlite_adapter.rb:208:in `encode' 

似乎有一個〜N(如在墨西哥辣椒)在您的姓名欄和SQLite的適配器不喜歡它。可能您的Salesforce批量寶石需要某種本地化設置。

這與rufus-scheduler無關。