2012-06-16 41 views
15

Ứng dụng của tôi đã bắt đầu ném lỗi khi tôi cố lưu một lớp cụ thể vào cơ sở dữ liệu. Tôi không chắc chính xác nguyên nhân khiến điều này bắt đầu xảy ra - Tôi đã gặp phải tất cả các loại vấn đề cơ sở dữ liệu trong vài ngày qua ....Rails 3.2 Postgres Lưu lỗi "ActiveRecord :: StatementInvalid: PG :: Lỗi: LRI: Lỗi cú pháp gần 'T' ở vị trí 5"

Trong mọi trường hợp, mô hình của tôi có vẻ hoạt động tốt (đó là tính toán đúng tất cả các giá trị before_save), nhưng sau đó nó cố gắng lưu vào cơ sở dữ liệu và thổi lên.

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

Ném lỗi này:

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

Tôi không có ý tưởng những gì lỗi này nghĩa là (hoặc những gì này 'T' là .....), hoặc thậm chí bắt đầu từ đâu xử lý sự cố nó .. .. Bất kỳ trợ giúp sẽ được đánh giá cao.

tôi có thể gửi bất kỳ thông tin có thể là cần thiết để con số này ra ....

di cư liên quan:

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/[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/ruby-1.[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 Một số mã mô hình theo yêu cầu.

thứ vĩ mô:

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' 

bất cứ điều gì và tất cả mọi thứ tôi có thể tìm thấy để làm với cột HStore tất cả tôi thực sự sử dụng HStore cho là dành cho một tìm kiếm trên mã cụ thể. Điều này được sử dụng để làm việc ... Tôi không biết những gì thay đổi. Tôi có thể đã nâng cấp Postgres (tôi đã chơi đùa với homebrew) hoặc có khả năng một cái gì đó thay đổi với đường ray. Tôi đã cố gắng quay trở lại 3.2.3 nhưng tôi đã nhận được lỗi tương tự.

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 

Tôi có thể đăng toàn bộ mô hình nếu điều này quá rời rạc. Cho tôi biết!

CẬP NHẬT # 2 - Tôi nhận được lỗi tương tự ở nơi khác cũng ....

Sau một đăng ký người dùng đơn giản ....

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

Có dường như là một điều gì đó thú vị đang diễn ra với bảng cơ sở dữ liệu/người dùng của tôi. Tôi nhận được lỗi sau trong khi tải môi trường khi di chuyể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

tôi 'd đoán nó là "T" trong "TSX". Lớp mô hình của bạn trông như thế nào? –

+0

Nó là khá lớn ... không chắc chắn chính xác những gì để đăng bài. Bạn có bất kỳ suy nghĩ nào về vấn đề có thể xảy ra không? Sau đó, tôi có thể gửi một số mã có liên quan .... Các bit TSX luôn luôn hiển thị trong chuỗi, vì vậy những gì có thể là vấn đề? Một cái gì đó với HStore? – Brandon

+0

Nói chung, có vấn đề với "[" std_dev ", # ]" ?? Đó là những gì ở vị trí số 5 .... nhưng đây chỉ là một số jane đơn giản trong một cột cơ sở dữ liệu thập phân ... Arg! (Điều gì là với không gian giữa xxx159 và 123244? Mặc dù?) – Brandon

Trả lời

33

Tôi vừa gặp sự cố tương tự, trên Rails 3.2. Nếu bạn không sử dụng Rails thân (làm việc hướng tới 4.0), nó không hiểu được hstore natively - bạn cần phải xác định một coder serialization (được cung cấp bởi các activerecord-postgres-hstore đá quý), như vậy:

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

ĐÂY LÀ NÓ! Cảm ơn!! Tôi không biết tại sao điều này lại đột ngột xảy ra. Tôi đã sử dụng Rails 3.2.3 trong một thời gian không có lỗi. Tôi đã nâng cấp lên 3.2.6 và nó đã tăng lên. Tôi đã sử dụng đá quý activerecord-postgres-hstore toàn bộ thời gian ... oh well. – Brandon

+2

Vấn đề này dường như có liên quan đến các phát biểu đã chuẩn bị. Tôi đã có cùng một vấn đề và nếu tôi vô hiệu hóa các câu lệnh đã chuẩn bị (sử dụng 'Prepare_statements: false' trong' database.yml') nó hoạt động trở lại, ngay cả khi không có 'serialize'. –

Các vấn đề liên quan