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

2011年11月14日月曜日

PDOでテーブルの列名を全て取得する方法

テーブルの列名を取得するには、MySQLならDESCRIBEで簡単にできるが、PostgreSQLだとpg_attributeカタログから取得しないといけないらしい。

でもPDOを使えばMySQLでもPostgreSQLでも取得できた。

$pdo = new PDO("$driver:dbname=$db", $user, $password);
$pdoStatement = $pdo->query("SELECT * FROM $table_name LIMIT 0");

$columns = array();

for ($i = 0; $i < $pdoStatement->columnCount(); $i++) {
    $meta = $pdoStatement->getColumnMeta($i);
    $columns[] = $meta['name'];
}

var_dump($columns);

もしテーブルに1行以上データがあることが保証されているなら普通に1行SELECTして連想配列の列名見れば済む話だが、データなしでも動くようにしたらこうなった。


ただし、PDOStatement->getColumnMeta()のマニュアルを見ると、
この関数は、 実験的 なものです。この関数の動作・ 名前・その他ドキュメントに書かれている事項は、予告なく、将来的な PHP のリリースにおいて変更される可能性があります。 この関数は自己責任で使用してください。
PDO ドライバの全てが PDOStatement::getColumnMeta(). をサポートしているわけではありません。
と書いてあり、PHPやDBのバージョンによっては上手く動かないかもしれないが、とりあえず手元の環境では動いた。


これでPHPでO/R Mapperを作りたい人も安心だ。

2011年6月21日火曜日

PostgreSQLで 最後にVACUUM / ANALYZEした日時を取得する SQL

PostgreSQLで、最後にVACUUM/ANALYZEした日時(AUTOと手動のそれぞれについて)を確認するSQL。

SELECT relname, n_live_tup, n_dead_tup, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze
FROM pg_stat_all_tables
WHERE schemaname = 'public' -- schemaname or relnameで絞りこむと見やすい
ORDER BY relname

参考:

2011年4月5日火曜日

PostgreSQLで日付や日時の差を計算する

PostgreSQLでは単純に引き算すれば日付間の差を取得できる。

SELECT '2011-12-31 23:59:59' - TIMESTAMP '2011-01-01 00:00:00' -- => "364 days 23:59:59"
結果はInterval型になる。

もちろん普通の日付型や日時型の列でもOK。
SELECT updated_at - created_at



条件として使う

条件として判定したい場合は下記のように文字列と比較できる。
SELECT '2011-12-31 23:59:59' - TIMESTAMP '2011-01-01 00:00:00' > '300 days' -- => TRUE
SELECT '2011-01-31 23:59:59' - TIMESTAMP '2011-01-01 00:00:00' > '300 days' -- => FALSE
SELECT '2012-12-31 23:59:59' - TIMESTAMP '2011-01-01 00:00:00' > '1 year' -- => TRUE
左辺を考慮して'300 days'のような文字列はInterval型にCASTして比較してくれる。
もちろWHERE句でも使える。



注意点

DATE型とDATE型の引き算の場合は結果がInterval型ではなく、日数を表すInteger型になる。
SELECT '2011-12-31' - DATE '2011-01-01' -- => 364
これを条件として判定したい場合は、'300 days'のような文字列(あるいはInterval型)ではなく、素直に数値で判定するか、あるいはTIMESTAMP型にCASTにする。
-- 数値で判定
SELECT '2011-12-31' - DATE '2011-01-01' > 300

-- TIMESTAMP型にCAST
SELECT '2011-12-31' - TIMESTAMP '2011-01-01' > '300 days'



参考:日付/時刻関数と演算子 (PostgreSQLマニュアル)

2011年3月25日金曜日

プログラム言語とフレームワークのオンラインマニュアル29選


Webで公開されている、プログラム言語・フレームワーク・DBのマニュアル(リファレンス)サイトへのリンクをまとめてみた。
選んだ基準は、できるだけ日本語で、なるべく分かりやすいこと。それを満たすなら公式リファレンスより非公式のものを優先している。



JavaScriptのマニュアルは他にも色々あり、使う人のレベルや用途によってどれが使いやすいかが変わってくると思うが、昔大変参考にさせて頂いた杜甫々版を挙げておいた。

Python、Perl、Objective-Cについては公式/準公式のリンクを書いたが、有志によるマニュアルでもっと良いものがあるのかもしれない。(これらの言語はあまり使わないので知らない。)

2010年10月26日火曜日

ファイル1つだけで出来ている 便利なPHP製ツールいろいろ

PHPライブラリは新時代に入った。定番だったphpMyAdminやPEAR::Mailはもう古い。最近は1ファイル配置するだけで簡単に使える便利なツールが増えてきた。

例えばこんなの。



次は1ファイルのフレームワークだね。(Google Code上にはもうたくさん公開されてるけど...)
あるいは1ファイルのブログシステムやWikiか?

2010年8月15日日曜日

CentOS5.5に PostgreSQL8.4をインスール&セットアップする手順

手順のメモ。

古いpostgresがインストールされていたので削除。

yum remove postgresql*
釣られてhttpd(Apache)もアンインストールされたが今回は構わない。


yumでpostgresをインストール。(CentOS5.5からは標準のyumリポジトリにPostgreSQL8.4がある。今までのpostgresと区別するために名前に"84"が付いている。)
yum install postgresql84-server
以下がインストールされる。
  • postgresql84-libs
  • postgresql84
  • postgresql84-server

必要に応じてdevelもインストール。
yum install postgresql84-devel


合わせてLinuxユーザーとして"postgres"が登録されるので、ユーザーを切り替える。
su postgres


初期化。
initdb --encoding=UTF-8 -D /var/lib/pgsql/data/
--encoding=UTF-8は無いとまずい?
--no-locale
は要るのかな?


rootに戻り起動。
/etc/init.d/postgresql start


OS起動時にpostgresが起動するようにしておく。
chkconfig postgresql on

2010年6月14日月曜日

システム開発で使うオンラインの日本語マニュアル



意外とマニュアル内検索が無かったり、あっても検索しづらかったりすることが少なくない。
また、普通にGoogle検索から探そうとすると古いマニュアルばかりヒットすることも(Postgresとか)。
素直に英語のマニュアルで調べればいいんだろうけど...

2010年5月28日金曜日

SQLの集計関数で NULLを含む列を集計する場合の注意点

MySQLとPostgreSQLの話。他のRDBMSは試してない。


SQLでNULLを含む列を集計する場合、NULLの行は無視される。

SELECT
  SUM(t.v) -- => 15
, MIN(t.v) -- => 0
, MAX(t.v) -- => 10
, COUNT(t.v) -- => 3 (NULLの行も入れれば4行)
, AVG(t.v) -- => 5.0000 (NULLの行をゼロと考えれば3.75)
FROM (
  SELECT NULL v
  UNION
  SELECT 0 v
  UNION
  SELECT 5 v
  UNION
  SELECT 10 v
) t
(PostgreSQL 8.4とMySQL 5.1で確認。)


SUM()やMIN()、MAX()では問題ないが、COUNT()やAVG()ではNULLの行の分も含めて計算したい場合に困る。

そういう場合、COALESCE()でNULLをゼロに変換するとよい。
SELECT
  COUNT(COALESCE(t.v, 0)) -- => 4
, AVG(COALESCE(t.v, 0)) -- => 3.7500
FROM (
  SELECT NULL v
  UNION
  SELECT 0 v
  UNION
  SELECT 5 v
  UNION
  SELECT 10 v
) t

MySQLの場合はIFNULL()でもOK。


参考
PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: Conditional Expressions
MySQL :: MySQL 5.5 Reference Manual :: 11.2.3 Comparison Functions and Operators

2010年4月5日月曜日

PostgreSQLで(ほぼ)リアルタイムにバックアップを取る方法

いろいろあるみたい


外部ツール



本体の機能

2010年3月20日土曜日

Webブラウザで DBを参照・更新・管理できるツールいろいろ

クラウドの時代ですから。

個人的にお薦めなのはAdminer。一般受けしそうなのはSQL Buddy。


MySQL用(上の方が使いやすい)

  • Adminer
    • PHP1ファイルのみ(無理に1ファイルにすることないと思うけど)。設置すれば設定不要ですぐ使える
    • シンプルだが普段使う機能は一通り揃ってる。シンプルだからこそ使いやすい
    • SQLをガリガリ書きたい人にお薦め
    • データのclone(コピー)ができるのが何気に便利
    • 見た目は少々無骨。CSSファイルをダウンロードすればSkinを変えられる
    • 昔はphpMinAdminという名前だったが改名した
    • 通常版より"English only"の方が少しファイルサイズが小さい。そんなに変わらないか
    • ライセンスはApache License
  • Adminer Editor
    • Adminerの簡易版。データの参照・登録・更新・削除だけしかできない
    • 別途Extensionsを用意しないと動かないようだ
    • データをいじるだけならこれでいいかも。逆に、データをいじる以上のこと(テーブルの変更とか、DBのDROPとか)をさせたくないユーザー向けに渡すのにちょうどいい(それを意識して作ったんだと思う)
  • SQL Buddy
  • phpMyAdmin
  • MySQL Quick Admin
    • 見た目はわりと良い。Ajaxでサクサク動く
    • 最初にconfig.phpを編集する必要があるみたい(ログイン機能がうまく動かなかったので)
    • SELECTのSQLを自分で書けない?実用するには辛いかも
    • 最後のUpdateは2007年6月。PHP5.3で動かすとDeprecatedが出る
    • ライセンスは明記されていないが、フォーラムにこんなやり取りが書いてあった
  • PHP Mini Admin for MySQL
  • Webadmin-mysql
    • あまり使われていない?


PostgreSQL用


これらのツールのようにPHPでつくっちゃえば、DB側がバージョンアップしてもphp-pdo/php-mysqlが対応してくれるので、ツール側での対応は特にいらないというのはクライアントアプリのツールには無い利点だと気付いた。

2010年3月3日水曜日

PostGISを使って平面直角座標系から世界測地系に変換する方法

こんな感じ。

SELECT AsText(Transform(GeomFromText('POINT(1 -1)', 2443), 4326))

"2443"のところは、平面直角座標系として日本のどこの座標原点を使っているかによって変わってくる。
それぞれのSRIDについてはYaskey GIS基礎知識を参照。

計算結果がの答え合わせは、緯度、経度への換算と比べる?(「度・分・秒」形式なので換算が必要)

2010年1月30日土曜日

CentOSを Webサーバとしてセットアップ

VMwareでCentOSをインストールした場合の参考サイトのメモ。
構成はApache + PHP + PostgreSQL。


IPアドレスを固定にする



yumの使い方を知る


ファイアウォールの設定


PHP 5.3をyumでインストール


PostgreSQL 8.4をyumでインストール


PostgreSQLの初期設定



サーバ起動時にデーモンを自動で起動する


システム時刻



2008年4月26日土曜日

Vistaに PostgreSQL 8.2をインストールする方法

Windows Vista Businessに、 PostgreSQL 8.2をインストールする方法のメモ。


参考: vistaにpostgreSQL8.1をインストール - minute


注意点

  • ユーザーを追加する際、コントロールパネルに「ユーザーアカウント」という項目があり紛らわしいので注意。こちらではなく、コンピュータの管理の「ユーザーとグループ」の方からユーザーを追加する。
  • PostgreSQLフォルダのアクセス権限設定は、ユーザーpostgresにフルコントロールを与えた方が良いように感じるが、それだと権限エラーでインストールに失敗する。上記参考記事のとおりにUsersにフルコントロールを与えればインストールに成功する。
  • バッチファイルでmsiexecを実行するやり方ではなぜかエラーになった。

2008年4月16日水曜日

好きなDBの投票結果

次の中で好きなプログラム言語は?の投票結果に続き、このブログの下端で好きなDBのアンケートをとった結果。

  1. MySQL 9 (50%)
  2. PostgreSQL 5 (27%)
  3. Oracle 5 (27%)
  4. SQLite 1 (5%)
  5. DB2 1 (5%)
  6. SQL Server 0 (0%)
  7. その他 3 (16%)

やはりMySQLが人気。

このブログでは比較的PostgreSQLネタが多いのでPostgreSQLはもうちょっと頑張るかと思ったが。

意外なのはOracleの人気が高かったこと。業務アプリではいまだに人気だが、エンジニアにも人気とは。

あとSQL Serverが不人気なのも悲しい。個人的には嫌いじゃないけどなあ。GUIも使いやすいし。SQL文法もANSIに近いし。副問い合わせが中途半端なMySQLに比べればいいと思うけど。

ところで、その他の3票は何だったのかな。

2008年3月4日火曜日

PDOでの PostgreSQLの booleanへの INSERT

PHPのPDOについて。

PDOのPrepared Statementで、PostgreSQLのboolean型の列にデータを登録する場合。

パラメータとしてPHPのbool値のfalseを渡すと、NULLになる。

$pdo = new PDO(省略);
$stmt = $pdo->prepare('INSERT INTO foo(bar) VALUES(?)');
$stmt->execute(array(false)); //=> NULLになる

FALSEを登録したい場合、文字列として"FALSE"を渡す。
$pdo = new PDO(省略);
$stmt = $pdo->prepare('INSERT INTO foo(bar) VALUES(?)');
$stmt->execute(array('FALSE')); //=> FALSEになる

TRUEの場合は、PHPのbool値のtrueでも、文字列の'TRUE'でもどちらでも大丈夫。

2008年2月8日金曜日

PgAdmin Ⅲのヘルプおじさん

いつからいるんだろう?1.8から?新しいマスコットか?!

2008年1月20日日曜日

PostgreSQLのバックアップとリストア

コマンドラインからやりたい場合。(WindowsのPgAdminIIIから接続できるなら、PgAdminIIIを使った方が楽。)

権限のあるユーザーで実行する。

バックアップ

pg_dump dbname > backup_file_path

リストア
psql dbname < backup_file_path

全てのデータベースをバックアップする場合はpg_dumpallで。
pg_dumpall > backup_file_path

2007年12月30日日曜日

CentOSにphpPgAdminをインストール

CentOS 5にインストールしたメモ。
Apache、PHPとPostgreSQLは事前にインストール済み。


phpPgAdminをダウンロード

wget http://downloads.sourceforge.net/phppgadmin/phpPgAdmin-4.1.3.tar.gz?download

解凍
tar -zxf phpPgAdmin-4.1.3.tar.gz

ディレクトリ名をアクセスしやすいものに変える
mv phpPgAdmin-4.1.3 pg

Webブラウザでアクセスしてみる (pgが/var/www/htmlにある場合)
http://ドメイン/pg/
ログイン画面が表示される。何もしなくても日本語で表示された。


ログインしようとするとエラーになった。
原因は、デフォルトではサーバ側でログインに使われるのがUnix Socketになること。
(今回はpostgresの設定をTCP接続のみパスワード指定でログインできる設定にしていた。)

phpPgAdminの設定ファイル(conf/config.inc.php)の該当行を変更。
// Hostname or IP address for server.  Use '' for UNIX domain socket.
// use 'localhost' for TCP/IP connection on this computer

$conf['servers'][0]['host'] = ''; //-> '127.0.0.1'に変更
これでログインできるようになった。
他にもいろいろ設定ができるので、必要に応じて変える。


ログインするとpgAdminIIIと同じように左側にツリーが表示される。
ツリーをクリックするとWebページの遷移なしで、ツリーが展開していく。phpMyAdminに比べて洗練されたUIだ。


データをCSVにエクスポートしたりインポートしたりもできて意外に便利そう。


参考:
 phpPgAdmin :: Download (本家ダウンロードページ)
 phpPgAdminの導入


(2010/04/07 追記)
SELinuxが有効だと、403 Forbiddenになることがある。
その場合は、「 /usr/sbin/setsebool -P httpd_can_network_connect_db on 」する。
参考:CentOS5.4でSELinux有効時にPHPでPostgresに接続できなかった - おきらく日記
それでも駄目なら、/var/www/htmlでgzを解凍する。(ユーザーのhomeディレクトリで解凍するとSELinux的にApacheが触っちゃダメなモノになる?)

また、デフォルトではpostgresやrootではphpPgAdminにログインできない。
参考:phpPgAdminにログインできないときの解決法 | tool | 『Weblogy』

Linuxでの PostgreSQLの初期操作

PostgreSQLインストール済みの状態から。


デーモンのステータスを確認。動いてなければstartさせる。

/etc/init.d/postgresql status
/etc/init.d/postgresql start

OSのユーザーをpostgresに切り替える。これにより、DBへのログインユーザーとしてOSのユーザーと同じpostgresが使われて、パスワードを入力しなくてもpsql等が使える。
OSのユーザーをpostgresに切り替えるためには、いったんrootになってからpostgresになる。(OSのユーザーpostgresのパスワードがわからないので。)
su -
su - postgres

既存のDB(postgres)以外のDBを使うなら、DBを作る。
createdb DB名

必要ならDBのユーザーも作る。
createuser ユーザー名

psqlでDBに接続する。
psql DB名

あとはpsqlで進めていく。


設定を変えるには、/var/lib/pgsql/dataにある、postgresql.confとpg_hba.confを書き換えてpostgresを再起動する。


参考:
 postgreSQL基本操作 : マロンくん.NET
 psql (本家マニュアル)
 PostgreSQLデータベースのコマンド
 phpPgAdminの導入
 pg_hba.confファイル (本家マニュアル)

2007年11月21日水曜日

psqlで対話型の簡易アプリ

備忘録として。
Windowsで簡易的に、いくつかの条件を入力後にSQLを実行するアプリ(batファイル)のサンプル。

前提条件

  • psqlがインストールされていること (PostgreSQLがインストールされていればbinフォルダにpsql.exeがある)
  • pgpass.confがあり、必要なログイン情報が書かれている (PgAdminⅢを使っていれば自動で作られる?)
    • pgpass.confは通常は C:Documents and Settingsユーザー名Application Datapostgresql にある。(Application Dataフォルダは、フォルダオプションで「すべてのフォルダとファイルを表示する」にしていないと表示されない)
      参考:パスワードファイル
    • このファイルが無いと、psql実行時にパスワード指定無しでの実行ができない

サンプルコマンド
@echo off
rem 必要な入力項目を入力してもらい、コマンドプロンプトの環境変数にセットする。
set /p foo_no= 番号を入力してください:
rem psqlのオプションとして-cを指定してパラメータのSQLを実行する
rem SQLにはコマンドプロンプトの環境変数を埋め込んでおく
C:(略)psql DB名 -U ユーザー名 -c "SELECT bar FROM baz WHERE foo_no = %foo_no%"
rem pause(「続行するには何かキーを押してください . . .」)より分かりやすいメッセージを表示したい
set /p foo_no= 終了するにはEnterキーを押してください

ブログ アーカイブ

tags