1

私は単純なルビースクリプトを持っています。

@connect = PGconn.connect(@host, 5432, '', '', @db, @dbuser, @password)
sql = "SELECT count(brand) as count FROM my_tbl WHERE time >= NOW() - 
INTERVAL '$1' HOUR GROUP BY my_tbl.brand HAVING count(brand) > $2 ORDER BY count DESC"
res = @connect.exec_params(sql,[1,2])

コードのこの部分を実行するたびにエラーが発生します

could not determine data type of parameter $1

私は何が欠けていますか?

[1,2] の代わりに文字列を配置しようとしましたが、それでも機能しませんでした。$1 にはアポストロフィがありますが、問題になることはありません。そうである場合 (アポストロフィを削除できません)、なぜですか?

PSコードはPGドキュメントに基づいています

4

1 に答える 1

3

これを試して

@connect = PGconn.connect(@host, 5432, '', '', @db, @dbuser, @password)
sql = "
  SELECT count(brand) as count 
  FROM my_tbl 
  WHERE time >= NOW() - $1::INTERVAL
  GROUP BY my_tbl.brand 
  HAVING count(brand) > $2::INTEGER 
  ORDER BY count DESC
"
result = @connect.exec_params(sql, ['1 HOUR', 2])
  • パラメーター トークンでデータ型を指定します
  • 間隔の「HOUR」部分をパラメータ値として渡します

アップデート

PS PG では、時間数を引用する必要があります。したがって、最初のパラメーターとして '1' HOUR になります。

私はpostgres 9.2.4を使用していますが、そうではありません。つまりselect '1 HOUR'::INTERVAL;、psqlで有効です。引用符は整数値と間隔タイプの両方にあることに注意してください

問題は、私が Ruby を初めて使用し (プログラミングではない)、Ruby の哲学を理解しようとしていることです。

Rubyの哲学をデータベースのやり取りから学ぶことはお勧めしません

ruby と postgres を (レールを使用せずに) 使い始めたい場合は、ActiveRecord を使用することをお勧めしますが、生の接続オブジェクトを使用してください。

于 2013-08-25T15:30:42.337 に答える