Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
913 views
in Technique[技术] by (71.8m points)

ruby - Rails 3.2 Postgres Save Error "ActiveRecord::StatementInvalid: PG::Error: ERROR: Syntax error near 'T' at position 5"

My app has started throwing errors when I try to save a particular class to the database. I'm not sure exactly what caused this to start happening - I've been having all kinds of database issues for the last few days....

In any case, my model seems to be working fine (it is properly calculating all of the before_save values), but then it tries to save to the database and blows up.

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", "--- 
- - 1.0
  - -0.4873114574375062
- - -0.4873114574375062
  - 1.0
"], ["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", "--- 
TSX: 0.5
VUSTX: 0.5
"]]

Throws this error:

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

I have no idea what this error means (or what this 'T' is.....), or even where to begin troubleshooting it.... Any help would be appreciated.

I can post whatever information might be necessary to figure this out....

Relevant migration:

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

Full stack trace:

    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/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.    6/lib/active_record/connection_adapters/postgresql_adapter.rb:1164:in `get_last_result'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.    6/lib/active_record/connection_adapters/postgresql_adapter.rb:1164:in `exec_cache'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.    6/lib/active_record/connection_adapters/postgresql_adapter.rb:665:in `block in exec_query'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.    6/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activesupport-3.2.6/lib/active_support/notifications/instrumenter.    rb:20:in `instrument'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.    6/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.    6/lib/active_record/connection_adapters/postgresql_adapter.rb:663:in `exec_query'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.    6/lib/active_record/connection_adapters/abstract/database_statements.rb:63:in `exec_insert'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.    6/lib/active_record/connection_adapters/abstract/database_statements.rb:90:in `insert'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.    6/lib/active_record/connection_adapters/abstract/query_cache.rb:14:in `insert'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/relation.rb:66:in `insert'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/persistence.rb:363:in `create'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/timestamp.rb:57:in `create'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/callbacks.rb:268:in `block in     create'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:403:in     `_run__772785567275930853__create__1186465801021498362__callbacks'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:405:in     `__run_callback'
... 11 levels...
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/validations.rb:50:in `save'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/attribute_methods/dirty.rb:22:in     `save'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/transactions.rb:241:in `block (2     levels) in save'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/transactions.rb:295:in `block in     with_transaction_returning_status'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.    6/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/transactions.rb:208:in     `transaction'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/transactions.rb:293:in     `with_transaction_returning_status'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/transactions.rb:241:in `block in     save'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/transactions.rb:252:in     `rollback_active_record_state!'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activerecord-3.2.6/lib/active_record/transactions.rb:240:in `save'
  from (irb):33
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/railties-3.2.6/lib/rails/commands/console.rb:47:in `start'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/gems/railties-3.2.6/lib/rails/commands/console.rb:8:in `start'
  from /Users/brandon/.rvm/gems/ruby-1.9.3-p194@myapp/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 Some model code as requested.

macro stuff:

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'

anything and everything I can find to do with the HStore column all I really use HStore for is for a search on specific tickers. This used to work... I don't know what changed. I might have upgraded Postgres (I was fiddling around with homebrew) or potentially something changed with rails. I did try going back to 3.2.3 but I got the same 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

I can post the entirety of the model if this is too disjointed. Let me know!

UPDATE #2 - I am getting similar errors elsewhere also....

After a simple user signup....

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", "joe@what.com"], ["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

There appears to be something funky going on with my database / user table. I get the following error during loading the environment in a migration:

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
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I just had a similar problem, on Rails 3.2. If you're not using Rails trunk (working towards 4.0), it doesn't understand the hstore natively - you need to define a serialization coder (which is provided by the activerecord-postgres-hstore gem), like so:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...