2012-06-16 12 views
15

La mia app ha iniziato a generare errori quando provo a salvare una determinata classe nel database. Non sono sicuro di cosa abbia causato questo evento - ho avuto tutti i tipi di problemi con i database negli ultimi giorni ....Rails 3.2 Postgres Salva errore "ActiveRecord :: Istruzione non valida: PG :: Errore: ERRORE: Errore di sintassi vicino a" T "nella posizione 5"

In ogni caso, il mio modello sembra funzionare bene (è calcola correttamente tutti i valori di before_save), ma poi prova a salvare nel database e fa esplodere.

SQL (0.8ms) INSERT INTO "portfolios" ("correlation_matrix", "created_at", "data", "mean_return", "std_dev", "updated_at", "weights") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" [["correlation_matrix", "--- \n- - 1.0\n - -0.4873114574375062\n- - -0.4873114574375062\n - 1.0\n"], ["created_at", Sat, 16 Jun 2012 15:12:35 MDT -06:00], ["data", {"TSX"=>0.5, "VUSTX"=>0.5}], ["mean_return", #<BigDecimal:7fadb119b750,'0.488052381E-1',18(45)>], ["std_dev", #<BigDecimal:7fadb119b598,'0.7668705159 123244E-1',18(45)>], ["updated_at", Sat, 16 Jun 2012 15:12:35 MDT -06:00], ["weights", "--- \nTSX: 0.5\nVUSTX: 0.5\n"]] 

Lanci questo errore:

ActiveRecord::StatementInvalid: PG::Error: ERROR: Syntax error near 'T' at position 5 

Non ho idea di cosa questo significhi di errore (o che cosa è questo 'T' .....), o anche dove per iniziare la risoluzione dei problemi esso .. .. Qualsiasi aiuto sarebbe apprezzato.

posso pubblicare qualsiasi informazione potrebbe essere necessario per capirlo ....

migrazione Rilevante:

create_table :portfolios do |t| 
    t.text :weights 
    t.decimal :mean_return, :precision => 15, :scale => 10 
    t.decimal :std_dev, :precision => 15, :scale => 10 
    t.text :correlation_matrix 
    t.hstore :data 

    t.timestamps 
    end 

    execute "CREATE INDEX portfolios_gin_data_hstore ON portfolios USING GIN(data);" 

completa analisi dello stack:

ActiveRecord::StatementInvalid: PG::Error: ERROR: Syntax error near 'T' at position 5 
: INSERT INTO "portfolios" ("correlation_matrix", "created_at", "data", "mean_return", "std_dev", "updated_at", "weights") VALUES ($1, $2, $3, $4,  $5, $6, $7) RETURNING "id" 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2. 6/lib/active_record/connection_adapters/postgresql_adapter.rb:1164:in `get_last_result' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2. 6/lib/active_record/connection_adapters/postgresql_adapter.rb:1164:in `exec_cache' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2. 6/lib/active_record/connection_adapters/postgresql_adapter.rb:665:in `block in exec_query' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2. 6/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activesupport-3.2.6/lib/active_support/notifications/instrumenter. rb:20:in `instrument' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2. 6/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2. 6/lib/active_record/connection_adapters/postgresql_adapter.rb:663:in `exec_query' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2. 6/lib/active_record/connection_adapters/abstract/database_statements.rb:63:in `exec_insert' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2. 6/lib/active_record/connection_adapters/abstract/database_statements.rb:90:in `insert' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2. 6/lib/active_record/connection_adapters/abstract/query_cache.rb:14:in `insert' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/relation.rb:66:in `insert' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/persistence.rb:363:in `create' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/timestamp.rb:57:in `create' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/callbacks.rb:268:in `block in  create' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:403:in  `_run__772785567275930853__create__1186465801021498362__callbacks' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:405:in  `__run_callback' 
... 11 levels... 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/validations.rb:50:in `save' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/attribute_methods/dirty.rb:22:in  `save' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/transactions.rb:241:in `block (2  levels) in save' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/transactions.rb:295:in `block in  with_transaction_returning_status' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2. 6/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/transactions.rb:208:in  `transaction' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/transactions.rb:293:in  `with_transaction_returning_status' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/transactions.rb:241:in `block in  save' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/transactions.rb:252:in  `rollback_active_record_state!' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/activerecord-3.2.6/lib/active_record/transactions.rb:240:in `save' 
    from (irb):33 
    from /Users/brandon/.rvm/gems/[email protected]/gems/railties-3.2.6/lib/rails/commands/console.rb:47:in `start' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/railties-3.2.6/lib/rails/commands/console.rb:8:in `start' 
    from /Users/brandon/.rvm/gems/[email protected]/gems/railties-3.2.6/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

UPDATE 1 Qualche codice modello come richiesto.

roba macro:

attr_accessible :weights 

serialize :correlation_matrix 
serialize :weights 

has_and_belongs_to_many :securities, :uniq => true 
has_and_belongs_to_many :efficient_frontiers 

before_validation :format_weights_tickers, :add_securities, :validate_weights, :set_weights_in_hstore, :build_correlation_matrix, :set_mean_return, :set_standard_deviation 

validates_presence_of :mean_return, :std_dev, :securities, :correlation_matrix, :weights 
validates_numericality_of :mean_return, :std_dev 

validate :uniqueness_of_weights 

before_destroy :check_for_dependent 

scope :by_std_dev, :order => 'std_dev ASC' 

nulla e tutto ciò che posso trovare a che fare con la colonna hstore tutto quello che ho davvero usare hstore per è per una ricerca su ticker specifici. Questo funzionava ... non so cosa sia cambiato. Potrei aver aggiornato Postgres (stavo armeggiando con homebrew) o potenzialmente qualcosa cambiato con i binari. Ho provato a tornare alla 3.2.3 ma ho avuto lo stesso errore.

def self.find_by_hstore(search_key, search_value) 
    where("data @> (:key => :value)", :key => search_key.to_s, :value => search_value.to_s) 
end 

def set_weights_in_hstore 
    self.data = {} if self.data.nil? 
    weights.each_pair {|ticker, weight| self.data[ticker.to_s] = weight} 
end 

posso postare la totalità del modello se questo è troppo sconnesso. Fammi sapere!

UPDATE # 2 - sto ottenendo errori simili anche altrove ....

Dopo una semplice registrazione utente ....

SQL (10.9ms) INSERT INTO "users" ("admin", "confirmation_sent_at", "confirmation_token", "confirmed_at", "created_at", "current_sign_in_at", "current_sign_in_ip", "data", "email", "encrypted_password", "last_email_at", "last_sign_in_at", "last_sign_in_ip", "name", "plan", "remember_created_at", "reset_password_sent_at", "reset_password_token", "selected_portfolio_id", "sign_in_count", "unconfirmed_email", "updated_at", "verified") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23) RETURNING "id" [["admin", false], ["confirmation_sent_at", Sat, 16 Jun 2012 20:37:07 MDT -06:00], ["confirmation_token", "7Xu15pMrV9zTNmofv8bD"], ["confirmed_at", nil], ["created_at", Sat, 16 Jun 2012 20:37:07 MDT -06:00], ["current_sign_in_at", nil], ["current_sign_in_ip", nil], ["data", {"min_rebalance_spacing"=>90 days, "max_contact_frequency"=>7 days, "allowable_drift"=>5}], ["email", "[email protected]"], ["encrypted_password", "$2a$10$HNUmlYmcVXbBsyZRFCAB7e8c5mf6S9UOdWr/ZCz10y5Sg4gOh8Zvq"], ["last_email_at", Sat, 16 Jun 2012 20:37:07 MDT -06:00], ["last_sign_in_at", nil], ["last_sign_in_ip", nil], ["name", "Joe Blow"], ["plan", "basic"], ["remember_created_at", nil], ["reset_password_sent_at", nil], ["reset_password_token", nil], ["selected_portfolio_id", nil], ["sign_in_count", 0], ["unconfirmed_email", nil], ["updated_at", Sat, 16 Jun 2012 20:37:07 MDT -06:00], ["verified", false]] 

20:37:07 log.1   | [ef4a7d55fb30e8fb82ac6c860e674bfc] [127.0.0.1] PG::Error: ERROR: Syntax error near 'm' at position 5 

20:37:07 log.1   | : INSERT INTO "users" ("admin", "confirmation_sent_at", "confirmation_token", "confirmed_at", "created_at", "current_sign_in_at", "current_sign_in_ip", "data", "email", "encrypted_password", "last_email_at", "last_sign_in_at", "last_sign_in_ip", "name", "plan", "remember_created_at", "reset_password_sent_at", "reset_password_token", "selected_portfolio_id", "sign_in_count", "unconfirmed_email", "updated_at", "verified") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23) RETURNING "id" 

UDPATE 3

Ci sembra essere qualcosa di funky in corso con il mio database/tabella utente. Ho il seguente errore durante il caricamento l'ambiente in una migrazione:

rake aborted! 
PG::Error: ERROR: relation "users" does not exist 
LINE 4:    WHERE a.attrelid = '"users"'::regclass 
             ^
:    SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc,   a.attnotnull 
       FROM pg_attribute a LEFT JOIN pg_attrdef d 
       ON a.attrelid = d.adrelid AND a.attnum = d.adnum 
      WHERE a.attrelid = '"users"'::regclass 
       AND a.attnum > 0 AND NOT a.attisdropped 
      ORDER BY a.attnum 
+0

I Suppongo che sia la "T" in "TSX". Come è la tua classe di modello? –

+0

È abbastanza grande ... non so esattamente cosa pubblicare. Avete qualche idea su quale potrebbe essere il problema? Quindi potrei postare del codice rilevante .... I bit TSX appaiono sempre nelle stringhe, quindi quale potrebbe essere il problema? Qualcosa con HStore? – Brandon

+0

Altrimenti, ha problemi con "[" std_dev ", # ]" ?? Questo è ciò che è in posizione # 5 .... ma questo è solo un semplice numero di Jane in una colonna di database decimale ... Arg! (Qual è lo spazio tra xxx159 e 123244? Però?) – Brandon

risposta

33

Ho appena avuto un problema simile, on Rails 3.2. Se non si utilizza Rails tronco (lavorando per 4,0), non capisce il hstore nativamente - è necessario definire un codificatore serializzazione (che è fornito dal activerecord-postgres-hstore gemma), in questo modo:

class Example < ActiveRecord::Base 
    serialize :data, ActiveRecord::Coders::Hstore 
end 
+0

QUESTO ERA! Grazie!! Non ho idea del perché questo si sia rotto all'improvviso. Ho usato Rails 3.2.3 per un po 'di tempo senza errori. Ho aggiornato a 3.2.6 e si è verificato. Ho usato l'activerecord-postgres-hstore gem tutto il tempo ... oh, va bene. – Brandon

+2

Questo problema sembra essere correlato alle istruzioni preparate. Ho avuto lo stesso problema e se disabilito le istruzioni preparate (usando 'prepared_statements: false' in' database.yml') funziona di nuovo, anche senza 'serialize'. –

Problemi correlati