ラベル PostgreSQL の投稿を表示しています。 すべての投稿を表示
ラベル PostgreSQL の投稿を表示しています。 すべての投稿を表示

2014年10月4日土曜日

PostgreSQLでのレコードを返す関数の実行

PostgreSQLで関数は普通こんな形でselect以下に書いて実行します。
postgres=# select sqrt(144);
 sqrt 
------
   12
(1 row)
普通の関数は上のでOK
しかし、record型を返す関数の場合はこの形で指定するとレコードがすべて1カラムに入って帰ってくるのでみずらい
postgres=# select pg_get_keywords();
                         pg_get_keywords                          
------------------------------------------------------------------
 (abort,U,unreserved)
 (absolute,U,unreserved)
 (access,U,unreserved)
 (action,U,unreserved)
 (add,U,unreserved)
 (admin,U,unreserved)
 (after,U,unreserved)
 (aggregate,U,unreserved)
 (all,R,reserved)
 (also,U,unreserved)
where句に入れるとレコードで帰ってくるよ
みやすい!
postgres=# select * from pg_get_keywords();
       word        | catcode |                   catdesc                    
-------------------+---------+----------------------------------------------
 abort             | U       | unreserved
 absolute          | U       | unreserved
 access            | U       | unreserved
 action            | U       | unreserved
 add               | U       | unreserved
 admin             | U       | unreserved
 after             | U       | unreserved
 aggregate         | U       | unreserved
 all               | R       | reserved
 also              | U       | unreserved

2014年9月21日日曜日

rubyからPostgreSQLへのアクセス その1

pgというgemでPostgreSQLへrubyからアクセスできます。
rubyには史上最強のO/R mapperであるActiveRecordが存在するため、PostgreSQLとのインターフェイスとしてはそちらを先に想定すべきです。
しかし、ちょっとSQLを投げたいだけの場合にはむしろこちらのほうが便利です。


基本:行数を表示するだけ


$LOAD_PATH << "."
require 'pg'

#接続する
db = PG::connect("127.0.0.1",5432 ,"","","mydb","sato","password")

#クエリの定義
sql="select count(*) from tbl";

#クエリの実行
result=@db.exec(sql)

#行数の表示
p result[0]["count"].to_i

注意していただきたいのはSELETしてきた結果の取り出しです。
pgでは結果はレコードを表すハッシュの配列として帰ってきます。
id,name.ageというテーブルがある場合、結果として帰ってくるのは次のような配列です。
result[0]['id']=>1
result[0]['name']=>sato
result[0]['age']=>26


result[1]には次の結果の行が入っています。
select max(id),max(age) のようなクエリを使った場合結果として帰ってくる行の名前が
同名であるため、maxというキーが2つ帰ってきます。
これでハッシュが上書きされるため正常に取り出せません。
AS 句をうまく使いましょう