2012-06-16 13 views
15

Mi aplicación ha comenzado a arrojar errores cuando intento guardar una clase en particular en la base de datos. No estoy seguro de qué fue lo que provocó que esto comenzara a suceder. He tenido todo tipo de problemas con la base de datos durante los últimos días ...Rails 3.2 Error de Error de Postgres "ActiveRecord :: StatementInvalid: PG :: Error: ERROR: Error de sintaxis cerca de 'T' en la posición 5"

En cualquier caso, mi modelo parece estar funcionando bien (es calculando correctamente todos los valores before_save), pero luego intenta guardar en la base de datos y explota.

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"]] 

Lanza este error:

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

no tengo idea de lo que significa este error (o lo que es esta 'T' .....), o incluso por dónde empezar a solucionar problemas que .. .. Cualquier ayuda sería apreciada.

me pueden enviar cualquier información que pueda ser necesaria para resolver esto ....

migración Relevante:

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);" 

completo seguimiento de la pila:

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>' 

ACTUALIZA 1 Algunos modelos de código según lo solicitado.

cosas 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' 

cualquier cosa y todo lo que puedo encontrar que ver con la columna de la hstore todo lo que realmente utilizo para hstore es para una búsqueda de teletipos específicos. Esto solía funcionar ... No sé qué cambió. Pude haber actualizado Postgres (estaba jugando con homebrew) o potencialmente algo cambió con los rieles. Intenté volver a 3.2.3 pero obtuve el mismo error.

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 

puedo publicar la totalidad del modelo si esto es demasiado inconexo. ¡Házmelo saber!

ACTUALIZACIÓN # 2 - Estoy recibiendo errores similares en otros lugares también ....

Después de un simple registro de usuario ....

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

Hay parece ser algo moderno con mi base de datos/tabla de usuarios. Recibo el siguiente error al cargar el entorno en una migración:

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 Supongo que es la "T" en "TSX". ¿Cómo se ve tu clase de modelo? –

+0

Es bastante grande ... no estoy seguro exactamente qué publicar. ¿Tiene alguna idea de cuál podría ser el problema? Entonces podría publicar algún código relevante ... Los bits TSX siempre aparecen en cadenas, así que ¿cuál podría ser el problema? Algo con HStore? – Brandon

+0

Alernatively, ¿está teniendo problemas con "[" std_dev ", # ]" ?? Eso es lo que está en la posición # 5 ... pero este es solo un número simple de jane en una columna de base de datos decimal ... Arg! (¿Qué hay con el espacio entre xxx159 y 123244?)? – Brandon

Respuesta

33

Acabo de tener un problema similar, en Rails 3.2. Si usted no está utilizando rieles tronco (trabajando hacia 4.0), que no entiende el hstore forma nativa - es necesario definir un codificador de serialización (que es proporcionada por el activerecord-postgres-hstore joya), así:

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

¡ESO FUE! ¡¡Gracias!! No tengo idea de por qué esto se rompió de repente. He estado usando Rails 3.2.3 por algún tiempo sin errores. Actualicé a 3.2.6 y estalló. He estado usando la gema activerecord-postgres-hstore todo el tiempo ... bueno. – Brandon

+2

Este problema parece estar relacionado con las declaraciones preparadas. Tuve el mismo problema y si desactivo las declaraciones preparadas (usando 'prepared_statements: false' en' database.yml') funciona nuevamente, incluso sin 'serialize'. –

Cuestiones relacionadas