SSブログ

django の Firebird バックエンド [Firebird]

これは、 Firebird Advent Calendar 2018 https://qiita.com/advent-calendar/2018/firebird の20日目の記事です。

Python の Web フレームワーク Django は、デフォルトではFirebird をデーターベースバックエンドとして使えませんが、サードパーティーのデーターベースバックエンドを使用すると使えるようになります。
(フルサポートというわけにはいきませんが)

Django データーベースバックエンドについては DjangoCongress 2018 の資料を見てください
https://gist.github.com/nakagami/098db7387d78ab9c6aa85d77a0eeecf5

私が知る範囲で開発が継続されているのは2種類あります。

ひとつは django-firebird
https://pypi.org/project/django-firebird/
現在の最新は、 Django 1.11 に対応したバージョン 1.11 です。
データーベースドライバー fdb で Firebird 2.x 以上をサポートしています。
https://www.firebirdnews.org/django-firebird-1-11-final-release-available-on-pypi/

もう一つは、私が開発しているdjfirebirdsql
https://pypi.org/project/djfirebirdsql/
https://github.com/nakagami/djfirebirdsql

Django、 データーベースドライバー pyfirebirdsql、Firebird のいずれもリポジトリの最新のバージョンを対象にしています。
これは、かなり expreimental な状態なので、安定性という意味では全くオススメしません。

Firebird4.0 の機能を使っているので、 django-firebird と生成される SQL文が異なります
正直、 stable な状態になるかわかりませんが、 Django 2.2 + Firebird 4.0 で使えるバージョンをリリースできると良いな、と思っています。
コメント(0) 
共通テーマ:日記・雑感

Firebird 4.0 のまで残件 [Firebird]

これは、 Firebird Advent Calendar 2018 https://qiita.com/advent-calendar/2018/firebird の17日目の記事です。

2.0をリリースしてから3.0 をリリースするまで10年もかかってしまったことの反省から、
「4.0 以降は1~2年毎にリリースしようねー」
という話になっていたと思うのだが、Firebird3.0 がリリースされて2年半以上の時が過ぎている・・・

Firebird 4.0 の Planning Board を確認してみた。
https://www.firebirdsql.org/en/planning-board/

IN PROGRESS になっている残件は以下の通り。

Mandatory features
++++++++++++++++++++

- 論理レプリケーション CORE-2021
- 統計情報の最適化 CORE-1082, CORE-1686

Optional features
++++++++++++++++++++

- Window 関数の拡張 CORE-1688 (ほぼ実装。残件は CORE-5338 )
- Time Zone サポートCORE-694, CORE-909 (マージ済み? )

Firebird に論理レプリケーション求めているひとあんまいなさそうだし、
もう残りは次のリリース(5.0?)に延期して、とっとと Firebird 4.0 リリースしても
いいんじゃないかなぁ・・・と感じている今日この頃。

コメント(0) 
共通テーマ:日記・雑感

Firebird 4.0 のTimeZone サポート [Firebird]

これは、 Firebird Advent Calendar 2018 https://qiita.com/advent-calendar/2018/firebird の11日目の記事です。

長いこと放置されているように見えたのですが、
つい二週間ほど前に、タイムゾーンサポートの Pull Request が master にマージされました。
まだ、足りないところもあるのかもしれませんが、もう後には引けないので
Firebird 4.0 ではタイムゾーン付きの time, timestamp が使えるようになります。
ドキュメントはこちら↓
https://github.com/FirebirdSQL/firebird/blob/master/doc/sql.extensions/README.time_zone.md

以下、最新の master をビルドして isql で実行してみた結果です

CREATE TABLE tz_test (
    id INTEGER NOT NULL,
    t TIME WITH TIME ZONE,
    ts TIMESTAMP WITH TIME ZONE
);
INSERT INTO tz_test (id, t, ts) values (1, '12:34:56', '1967-08-11 23:45:01');
select * from tz_test;

          ID                                              T                                                        TS
============ ============================================== =========================================================
           1 12:34:56.0000 Etc/UTC                          1967-08-11 23:45:01.0000 Etc/UTC


SET TIME ZONE 'Asia/Tokyo';
INSERT INTO tz_test (id, t, ts) values (2, '12:34:56', '1967-08-11 23:45:01');
select * from tz_test;

          ID                                              T                                                        TS
============ ============================================== =========================================================
           1 12:34:56.0000 Etc/UTC                          1967-08-11 23:45:01.0000 Etc/UTC
           2 12:34:56.0000 Asia/Tokyo                       1967-08-11 23:45:01.0000 Asia/Tokyo


コメント(0) 
共通テーマ:日記・雑感

Firebird データのバックアップとリストア [Firebird]

これは、 Firebird Advent Calendar 2018 https://qiita.com/advent-calendar/2018/firebird の5日目の記事です。

https://nakagami.blog.so-net.ne.jp/2018-12-02 にインストールについて書いたのですが、
最近、Firebird を使ってみたという日本語の記事を見ないので、
もしかしてバックアップとかリストアとかの手順についても、ロストテクノロジーなの?
・・・ということに気づいて、ごく基本的な Firebird のデーターベースのバックアップとリストアにつても書きます。

【サービスを停止してデーターベースをコピーする】
Firebird は、1ファイル=1データーベースなので、データーベースファイルをコピーすることで、バックアップ
することができます。
コピーでバックアップする場合は、 firebird のサービスは止めておいたほうが良いでしょう。
sudo systemctl stop  firebird3.0


ファイルをどこかにコピー

sudo systemctl start  firebird3.0


【オンラインでバックアップ、リストア】

gbak というコマンドで、バックアップとリストアができます。
gbak を使うと、firebird のサービスを動かしたままバックアップとリストアができます。

バックアップ
sudo gbak -b /var/firebird/myfirst.fdb /tmp/myfirst20181205.fbk

リストア
sudo gbak -r /tmp/myfirst20181205.fbk /var/firebird/myrestore.fdb


同じファイルにリストア
$ sudo gbak -r /tmp/myfirst20181205.fbk /var/firebird/myfirst.fdb
gbak: ERROR:database /var/firebird/myfirst.fdb already exists.  To replace it, use the -REP switch
gbak:Exiting before completion due to errors

と出てしまうので
sudo gbak -r /tmp/myfirst20181205.fbk /var/firebird/myfirst.fdb -rep

と -rep オプションをつけます
コメント(0) 
共通テーマ:日記・雑感

Ubuntu に Firebird3.0 をインストール [Firebird]

これは、 Firebird Advent Calendar 2018 https://qiita.com/advent-calendar/2018/firebird の2日目の記事です。

2018年の Firebird 的な大きな出来事と言えば、個人的には Ubuntu 18.04 LTS のパッケージで Firebird 3.0 がインストールできるようになったことです。
Ubuntu 16.04 は、Firebird 2.5 でした。

Ubuntu 17.10 の頃には Firebird 3.0 のパッケージが用意されていたのですが、やはり、LTS で使えることには大きいと思っています。

というわけで、Ubuntu で、Firebird を使うまでの手順を以下に書いておきます。

【Firebird3.0のインストール】

インストールの途中で、SYSDBA ユーザーのパスワードを聞かれます。

$ sudo apt install firebird3.0 -y

Password for SYSDBA:
SYSDBA のパスワードをあとで変更するのは
$ sudo dpkg-reconfigure firebird3.0-server
でできます。


Firebird のコマンドツールは isql という名前ですが、 Debian/Firebird では、isql-fb という名前になっています。

【データーベースを置くディレクトリの作成】

Firebird では、1データーベース=1ファイルの構成になっていて、Ubuntu では、そのファイルが firebird ユーザーで読み書きできる権限が必要です。
どこでもよいのですが、今回は /var/firebird ディレクトリを読み書きできるようにして、そこにデーターベースファイルを置くようにしてみます。

$ sudo mkdir /var/firebird
$ sudo chown firebird:firebird /var/firebird
$ ls -l /var |grep firebird
drwxr-xr-x  2 firebird firebird 4096 Dec  1 07:20 firebird


【データーベースの作成】

/var/firebird に myfirst.fdb というデーターベースを作ってみます。下記XXXXは、インストール時に設定したパスワード

$ isql-fb -U sysdba -P XXXXX
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 'localhost:/var/firebird/myfirst.fdb';
(Ctrl+D で isql-fb を終了)

【データーベースへの接続】

既存のデーターベースに接続します。

$ isql-fb -U sysdba -P XXXXX localhost:/var/firebird/myfirst.fdb
Database: localhost:/var/firebird/myfirst.fdb, User: SYSDBA
SQL>

【サーバーのコンフィギュレーション】

/etc/firebird/3.0/firebird.conf にサーバーの設定が書かれています。
例えば、 localhost 以外からの接続を許可したい場合は、このファイルの
RemoteBindAddress = localhost
この部分を書き換えます
コメント(0) 
共通テーマ:日記・雑感

LibreOffice 6.1 リリース [Firebird]

8/9 に、LibreOffice 6.1 がリリースされた。
Base で、いったん外れていた Firebird の embedded engine が再び使えるようになった。
・・・らしいので 手元の Windows に LibreOffice 6.1 をインストールしてみた。

そのまま使えるかと思ったら、デフォルトでは HSQLDB しか使えなくて、ここにあるよ「LibreOffice」→「詳細」→「実験的な機能を有効にする」で
https://www.gesource.jp/weblog/?p=6400
Base データベースを新規作成するときに「Firebird(埋め込み)」が選べるようになった。
将来的には、HSQLDB がサポートから外れて Firebird がデフォルトになるらしい。
途中でデーターベースエンジンを変更するとは大胆だが、 LibreOffice がデーターベースエンジンのメンテナンスをするつもりはないようなので、そういう選択もありかなと思った。

また、「既存のデーターベースに接続」で「Firebirdのファイル」を選択できるようになった。

作成された .odb ファイルを unzip するとdatabase/firebird.fbk というファイルが
できて Firebird のバックアップファイルらしい。
そのうちバージョンも確認したいけど、 ここらへんを見ると Firebird3 のようだ
https://www.firebirdnews.org/firebird-3-by-default-in-libreoffice-5-4-base/

コメント(0) 
共通テーマ:日記・雑感

Firebird4.0 Planning Board 2017 update [Firebird]

この記事はFirebird Advent Calendar 2017 https://qiita.com/advent-calendar/2017/firebird の24日目の記事です。

Firebird Advent Calendar 2016 の http://nakagami.blog.so-net.ne.jp/2016-12-19 の振り返り
↑を書いた時には、Planning Board にある Deadline は遅れに遅れていたのですが、その後日付が見直されて、現在は妥当な進捗になっているようです。

Firebird の Planning Board はここにあります
https://www.firebirdsql.org/en/planning-board/

各機能の status を見ても、(間に合わなさそうな issue の status を POSTPOND にすることも考えると)Beta Release の2018-01-01 も、無理ではない気がします。

Firebird 4.0 の alpha1 はリリース済みです
https://www.firebirdsql.org/en/news/firebird-4-0-alpha-1-release-is-available-for-testing/
まだ、実装予定の機能もあるみたいなんですが、 個人的には alpah1 の機能で 4.0 をリリースしちゃってもらって、未実装の機能は 5.0 以降でいいかな、と思います。
4.0 まで未実装の機能↓
http://tracker.firebirdsql.org/secure/IssueNavigator.jspa?reset=true&mode=hide&sorter/order=DESC&sorter/field=priority&resolution=-1&pid=10000&fixfor=10750

COMPLETE になっていて私が注目している機能は以下のようなところです

- 物理スタンバイ
- 31文字以上の識別子(63文字)
- Windows 関数の追加
- Decimal の精度向上 https://github.com/FirebirdSQL/firebird/pull/108/files

IN PROGRESS で注目している機能は
- ビルトイン論理レプリケーション
です

コメント(0) 
共通テーマ:日記・雑感

Firebird Contributors [Firebird]

この記事はFirebird Advent Calendar 2017 https://qiita.com/advent-calendar/2017/firebird2120日目の記事です。(間違えてた&間に合ってない。21日に書いたけど 20日の記事でした)

いつの頃からかわからないんですが、Firebird の公式サイトの Contributors のページに名前載ってました。

https://www.firebirdsql.org/en/contributors/

Jim Starkey, Ann Harrison ご夫妻と名前を連ねることができて大変光栄です。

まあ、このお二方は、名誉職的なポジションですが、RedSoft Corporation という会社の人たちが、最近の Firebird の重要な機能の寄贈をしてくれていて、その人たちと一緒に Contributers に名前を載せていただいているのは、さらに光栄です。
コメント(0) 
共通テーマ:日記・雑感

pyfirebirdsql 1.0.1 released [Firebird]

この記事はFirebird Advent Calendar 2017 https://qiita.com/advent-calendar/2017/firebird の17日目の記事です。
python の Firebird データーベースドライバー pyfirebirdsql の 1.0.1 を昨日リリースしました

https://pypi.python.org/pypi/firebirdsql/1.0.1

1.0.0 をリリースしたのが昨年のアドベントカレンダー6日目なので、1年ぶりのリリースです
http://nakagami.blog.so-net.ne.jp/2016-12-06

機能の追加は IPv6 サポートだけです。

もう、あまり機能の追加をする気はないのですが、Firebird 4.0 になると、新しいデータ型が追加されるようなので、その時には対応したバージョンを出すと思います。

コメント(0) 
共通テーマ:日記・雑感

Firebird 3.0 の新しい SQL 構文 [Firebird]

この記事はFirebird Advent Calendar 2017 https://qiita.com/advent-calendar/2017/firebird の15日目の記事です。

いままでと重複あるかもしれませんが、ここで Firebird3.0 のリリースノートを見直して、新しい SQL 構文を自分で試してみました。
https://firebirdsql.org/file/documentation/release_notes/Firebird-3.0.0-ReleaseNotes.pdf
(トリガーは自分は使わなさそうなので試してません)

【BOOLEAN Type】
いままでは 0/1 で持っていたのですが、BOOLEAN 型ができました。
SQL> CREATE TABLE bool_table (b BOOLEAN);
SQL> INSERT INTO bool_table (b) VALUES (TRUE);
SQL> INSERT INTO bool_table (b) VALUES (FALSE);
SQL> INSERT INTO bool_table (b) VALUES (NULL);


MySQL の boolean みたいに 1/0 じゃなくて true/false が返ります。

【自動インクリメント型のカラム定義】
今までも、 generator + trigger を使うとか、sequence を使うとかで、
自動インクリメントで採番するカラムの作成はできたんですが
https://firebirdsql.org/refdocs/langrefupd21-ddl-sequence.html

より、直接的に書ける方法ができました。
SQL> CREATE TABLE id_table (id INTEGER GENERATED BY DEFAULT AS IDENTITY, name VARCHAR(30));
SQL> INSERT INTO id_table (name) VALUES ('nakagami');
SQL> SELECT * FROM id_table;

          ID NAME
============ ==============================
           1 nakagami



採番される値をリセットするには、以下のような SQL文を使います
SQL> ALTER TABLE id_table ALTER COLUMN id RESTART; 
SQL> ALTER TABLE id_table ALTER COLUMN id RESTART WITH 100; 

WITH 100 を付けた場合、次の INSERT 文では 101 が設定されます。


【カラムの NOT NULL 制約を付ける、外す】
カラムの NOT NULL 制約を付けたり外したりするのに、今まではシステムテーブルを update するという荒業が行われていました。
http://www.firebirdfaq.org/faq103/

Firebird 3.0 から、このシステムテーブルの update ができなくなり(エラーになり)代わりに、カラムの nullability を設定する直接的な ALTER 文が書けるようになりました。

table に NOT NULL 制約を付ける
ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;

table の NOT NULL 制約を外す
ALTER TABLE table_name ALTER COLUMN column_name DROP NOT NULL;

【OFFSET/FETCH 句】
結果セットの中の「何行目から何行」という指定をしたいときは、
いままでも、 FIRST ~ SKIP という構文は使えました。
https://scott.yang.id.au/2004/01/limit-in-select-statements-in-firebird.html

SQL:2008 標準で OFFSET ~ FETCH という構文があるそうで、Firebird 3.0 で、それが使えるようになりました
SQL> select id from id_table order by id;

          ID
============
           1
           2
           3
           4

SQL> select id from id_table order by id offset 1 rows fetch next 2 rows only;

          ID
============
           2
           3


コメント(0) 
共通テーマ:日記・雑感