postgres/ja

From Free Pascal wiki
Jump to navigationJump to search

Deutsch (de) English (en) español (es) français (fr) 日本語 (ja)

データベースのポータル

参照:

チュートリアル/練習となる記事:

各種データベース

Advantage - MySQL - MSSQL - Postgres - Interbase - Firebird - Oracle - ODBC - Paradox - SQLite - dBASE - MS Access - Zeos

概要

Free Pascal/LazarusをPostgreSQLデータベースサーバにアクセスするために用いることができる。もしFPCのpostgresパッケージの情報を探しているのであれば以下のpostgres/ja#PostgreSQL パッケージ: 低レベルユニットを参照されたい。

PostgreSQLを用いる利点:

  • 広く用いられ、利用可能である
  • 非常に安定しており、一貫性がある
  • MySQLと異なり自由なライセンス(コストがかからない)である

PostgreSQLを用いる不利な点:

  • あるホストはPostgreSQLを提供しないかもしれない
  • 組込バージョンがない

Win64: ここはあるFPC/Lazarus Win64バージョンを用いてはいないを参照されたい

PostgreSQLへの直接接続

PostgreSQLデータアクセスコンポーネント(PgDAC)を用いてPostgreSQLに接続できる。これは32-bit、64-bit双方でWindows、Mac OS X、iOS、Android、Linux、FreeBSDでLazarus(およびFree Pascal)からPostgreSQLに直の接続を提供するライブラリである。PgDACはプログラマに非常に軽量で、高速、きれいなPostgreSQLデータベースアプリケーションをほかの付加的なライブラリを用いずに開発できるように設計されている。

これは無料で [devart.com/pgdac/download.html Lazarus component] からダウンロードできる。

Zeos

ZeosはPostgreSQLをサポートしている; ZeosDBOを参照されたい。

SQLDB

FPC/LazarusはPostgreSQL接続コンポーネント/クラスで既定でPostgreSQLをサポートしている。もしFPCで手動でPostgreSQLサポートを用いているのであれば、uses句にpqconnectionを加えること。そうでなければ、Lazarusがコンポーネントを提供する:

sqldbcomponents-n.png

注意: Libpq Cには繰り返しライブラリが読み込み、解放を繰り返すと若干のメモリリークがある(少なくともPostgresのバージョン9.3まで) SQLDBはこのライブラリを最初にコネクションが成立すると読み込み、最後のコネクションが閉じると解放する。これはいつ最後のコネクションが閉じられても小さなメモリリークが生じることを意味する。これが起こらないようにする(そしてアプリケーションの速度を上げる)ためには最初のInitialisePostgres3プロセスの始まりに一度ライブラリを呼ぶことをである。

文字集合プロパティはクライアントのエンコードが用いられる。

TPQConnectionは直接ポートプロパティをサポートしないが、Paramsパラメータを介してコンポーネントにポートを通すことができる:。

PQConnection.Params.Add('port=' + VariableContainingPort);

また、他のPostgreSQL特異的コネクションパラメータはParamsプロパティを用いて定義可能である:

PQConnection.Params.Add('application_name=''yourappname''')

全てのサポートするコネクションパラメータについてはConnection Parameter Key Wordsを参照されたい。

PostgreSQL/SQLDB、同様にSQLite/SQLDB、Firebird/SQLDB、基本的にRDBMS SQLDBサポート書かれたGUIデータベースプログラムを生成するプログラムのチュートリアルは SQLdb_Tutorial1/ja を参照されたい。

イベントモニタリング

もしFPC2.6.2+と最近のバージョンのLazarusがあれば、PostgreSQLに由来するイベントをモニターするために、TPQTEventMonitorを用いることができる。

これはPQEventMonitorを介する小さなラッパであり、詳細はFPC pqeventstest.pp例示プログラム参照されたい。

インストールとエラー

全てのsqldbユニット同様に、以下へ(PostgreSQLに必要とされるすべての .dll/.manifest)ドライバライブラリを加えなければならない

  • ライブラリサーチパスのあるディレクトリ(例えばWindowsではc:\windows\system32)
  • または (Windows) プログラム出力ディレクトリ(たとえばプロフェクトディレクトリ lib/なんとか/

Windows 64 bit ドライバ

もし、64bitアプリケーションを開発するなら、64bit DLLを用いなければならない。

Light bulb  Note: FPC 2.6.0 (即ち Lazarus 1.0.4 もしくは下) ではWindows 64 bitはPostgreSQLをサポートしない(もちパッチを当てずにコンパイルし直さなければ。

Windows 64は見つけるのが困難だが、ここからダウンロードできる: [1]。 32-bitドライバライブラリはc:\windows\system32、誤解を招きやすい名前だが、c:\windows\syswow64へインストールされる。

エラー: "Can not load PostgreSQL client library "libpq.dll""

プログラムはPostgreSQLドライバファイルを見つけることができない。

ライブラリをインストールする場所は上記の解説を参照されたい。

WindowsでPostgreSQLにLazarusを接続するときにDLL含めるやり方について例示している良い例はeasyDBである。

Linux/Unix/OSX: PostgreSQLライブラリがライブラリサーチパスに含まれるようにすること、例えば:

  • Linuxではlibpq.soが/etc/fpc.cfgファイルのパスに追加する。例えば : -Fl/usr/local/pgsql/lib
  • 一般的なライブラリ名に特定のバージョンからシンボリックリンクを作る必要があるかもしれない:
    ln -s /usr/lib/pqsql.so.5 /usr/lib/pqsql.so
    
    。また個別にpostgresqlクライアント-devパッケージをディストリビューションパッケージマネージャでインストールする必要があるかもしれない。

パラメータをクリアするときの問題

Light bulb  Note: これを確かめよ: .paramtypeは本当に必要か?

少なくともFPC <= 2.6.2ではもしパラメータを .Clearするときには(例えばNULLに設定する), PostgreSQLはパラメータの型を認識するのにてこずるかもしれない。

この場合、例えば明示的に型を指定する:

FWriteQuery.Params.ParamByName('LONGITUDE').ParamType:=ptInput; //PostgreSQLでは必要とされる
FWriteQuery.Params.ParamByName('LONGITUDE').Clear

仕方

値を返すキーワード

最後に挿入したID

PostgreSQLでは最後に挿入したIDを得るために2度目のクエリを行う必要はない。

INSERT RETURNINGを用い、値を読むこと:

var 
  ID: Integer
..
Query.SQL.Text:= 'INSERT INTO myschema.films(film_name)' +
                 'VALUES(:film_name) RETURNING film_id;';
Query.Open;
ID:= Query.FieldByName('film_id').AsInteger;

複数のフィールドと説明を取得する

PostgreSQLでRETURNINGは大方のデータベースエンジンより柔軟である。SELECTリストで見受けられるフィールドのリスト、定数、表現のいずれもINSERT、UPDATE、DELETEステートメントで動作する。

INSERT INTO films (film_name) VALUES ('val') RETURNING film_id;  -- 新たに作成された行
INSERT INTO films (film_name) VALUES ('val') RETURNING film_id, kind;  -- 新しく作成された行のid、フィールド型を返す
INSERT INTO films (film_name) VALUES ('val') RETURNING *; -- Returns all fields in newly created rows.
     
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama' RETURNING film_id; -- アップデートされた行のidを返す
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama' RETURNING film_id, film_name; -- アップデートされたidと映画の名前を返す
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama' RETURNING *; -- アップデートされた行のすべてのフィールドを返す
     
DELETE FROM films RETURNING film_id; --消去された行のid
DELETE FROM films RETURNING film_id, film_name; --消去された行のidと映画の名前
DELETE FROM films RETURNING *;  -- 消去された行のすべてのフィールドを返す

フィールド、定数、表現を用いたRETURNING:

INSERT INTO films (film_name) VALUES ('val') RETURNING id, 'a' AS a, id*2 AS doubled_id, CASE WHEN id > 100 THEN 'a' ELSE 'b' END AS foo;

PostgreSQL パッケージ: 低レベルユニット

データベースで一般的なように、SQLDBコードはPostgreSQLドライバライブラリ(.so/.dll/.dylib)を包含する低レベルの特定のユニットである。 通常、高レベルのSQLDBコードをより迅速に、データベースを切り替えるなどのために用いるだろう。

この使い方は非常に簡単であり、あるユニットをコンパイルし、そのユニットをプログラムの中で用いる。PostgreSQLクライアントライブラリ(libpq)の場所をコンパイルするときに明示しておく必要がある。それだけである。

postgresという名前のメインユニットは、通常uses句に含まれなければならない。

必須事項

少なくとも、FPCバージョン0.99.5が必要である(基本的に極端に古いものを除くすべてのバージョン)。ヘッダはPostgreSQLバージョン6.3.1から移殖されている。

インストール

PostgresユニットはFree Pascalパッケージに同梱されており、コンパイラとともに配布されている。これはディレクトリpostgresに含まれ、ユニット、テストプログラムとmakefileが含まれる。そのディレクトリに移動し、システムのために変数を設定し、Makefileを編集すること。1つのことを指定するだけでよい:

  1. libpqライブラリが存在するディレクトリ、通常/usr/local/pgsql/lib

タイプ

make

これで、ユニットとプログラムがコンパイルされるはずである。もしコンパイルに成功したら

make install

でインストールする。 (どこのディレクトリにユニットがインストールされるか設定を覚えておくこと)

make test

でテストランを行える。

これは:

  • テストプログラムtestpgを実行する。これはPostgreSQLプログラマーズガイドのサンプルプログラムのpascalに対する直訳である。
  • データベースにテーブルを作るスクリプトを実行すること、そしていくつかのデータを入力する。(psql プログラムはこのためPATHに含まれること)。デフォルトでは用いられるデータベースはtestdbである。
  • テストプログラムtestemailを実行する
  • 作成されたテーブルを消去するためにシェルスクリプトを再び実行する。

画面にはフィードバックと結果の多くのメッセージが現れる。もし何かがおかしければ、makeがそれを知らせてくれる。

Packages Listに戻る。

以下も参照のこと

  • TPSQL - 異なるPostgreSQLのデータセット/データベースコンポーネント
  • Lazarus DB Faq/ja - データベースプログラミングの追加情報
  • Lazarus Database Tutorial/ja - Lazarusを様々なデータベースで動作させること