-
インストールに必要になる libtommath というものを先に入れます。
sudo dnf install libtommath
-
ダウンロードとインストールは簡単です。
wget https://github.com/FirebirdSQL/firebird/releases/download/v5.0.1/Firebird-5.0.1.1469-0-linux-x64.tar.gz
tar xozf Firebird-5.0.1.1469-0-linux-x64.tar.gz
cd Firebird-5.0.1.1469-0-linux-x64
sudo ./install.sh
install.shの途中で管理者パスワードを聞かれるので、入力します(入力中のパスワードは非表示にはなりません)。
-
インストールが完了するとそのままサービスが起動状態になっているので、確認します。
systemctl status firebird
-
Firebirdの実行ファイルは/opt/firebird/binに入るので、~/.bashrcなどを編集して環境変数PATHに追加しておきます。
export PATH="/opt/firebird/bin:${PATH}"
-
データベース置き場を作ります。PostgreSQLにおける$PGDATAみたいな標準の場所があるのかどうか分かりませんが、
ここでは適当に /var/lib/firebird/data という場所にしています(/var/lib/firebirdも作られていません)。
この場所は、firebirdユーザーで読み書き可能になっている必要があります。
sudo mkdir -p /var/lib/firebird/data
sudo chown firebird:firebird /var/lib/firebird/data
-
データベースと(一般)ユーザーを作成します。以前のバージョンではgsecというツールがありましたが、
今は非推奨になっており、データベースやユーザーの管理なども全てisqlコマンドで行うようになりました。
CREATE DATABASE 'localhost:/var/lib/firebird/data/mydb.fdb' USER 'SYSDBA' PASSWORD '{install.shで入力したPW}';
ALTER DATABASE SET DEFAULT CHARACTER SET UTF8;
CREATE USER TESTUSER PASSWORD 'testpass';
GRANT CREATE TABLE TO TESTUSER;
GRANT CREATE VIEW TO TESTUSER;
GRANT CREATE PROCEDURE TO TESTUSER;
quit;
RDBMSの伝統に沿って、ユーザー名は大文字小文字を区別しないらしいです。
また、isqlの終了は quit; と exit; のどちらでも可能です。
なお、OracleのSQL*Plusなどと異なり、Firebirdのisqlはいかなる場合も文末のセミコロンは必須です。
SQLでも、isqlのコマンドでも同じです。
-
一般ユーザーでテーブルなどを作り始めます。このコマンドラインツールもisqlです。
CONNECT 'localhost:/var/lib/firebird/data/mydb.fdb' USER 'TESTUSER' PASSWORD 'testpass';
CREATE TABLE SCORES(NAME VARCHAR(30) NOT NULL, SCORE INT);
INSERT INTO SCORES(NAME,SCORE) VALUES('TARO', 90);
INSERT INTO SCORES(NAME,SCORE) VALUES('JIRO', 88);
COMMIT;
SELECT * FROM SCORES;
quit;
ユーザー、パスワード、データベースをコマンドラインで指定してisqlを起動できます。
isql -u testuser -p testpass -charset utf-8 localhost:/var/lib/firebird/data/mydb.fdb
オプションを何もつけない引数がデータベースのパスとみなされます。
bashのaliasに登録しておくと便利です。
FirebirdではOracleでいうシーケンス(SEQUENCE)の事をジェネレーター(GENERATOR)と呼ぶようですが、
どちらにしても主キー列に自動で連番を振るにはそれらを明示的に使う必要はなく、次のようにします。
これがSQL標準の記法らしいです。
GENERATED BY DEFAULTの場合、この列にINSERT文で明示的に値を設定するとそちらが優先され正常に実行されますが、
代わりにGENERATED ALWAYSを指定した場合、この列にINSERT文で明示的に値を設定できずエラーになります。
CREATE TABLE ITEMS(
ITEM_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
ITEM_NAME VARCHAR(50) NOT NULL,
CATEGORY_ID INTEGER,
SIZE_DESC VARCHAR(50),
PRICE INTEGER,
VENDOR_CODE VARCHAR(12)
);
外部からSQLファイルを実行するには、コマンドラインに書く方法と、isqlの内部からINPUTコマンドで実行する方法があります。
isql -u testuser -p testpass -charset utf-8 localhost:/var/lib/firebird/data/mydb.fdb -i /the/path/of/script.sql
INPUT /the/path/of/script.sql;
-- テーブルの一覧
SHOW TABLES;
-- 指定したテーブルの定義を見る
SHOW TABLE ITEMS;
Firebirdは今日のRDBMSの王道的なデータ型を全てサポートしており、
私のような初心者もほとんど迷うことはありませんでした。
整数型にはSMALLINT、INTEGER、BIGINTがあり、INTEGERはINTと省略可能です。
小数・実数型にはFLOAT、DOUBLE PRECISION、DECIMALとNUMERIC(同じもの)があります。
文字型にはCHARとVARCHARがあり、より長い名前のCHARACTERとCHARACTER VARYINGも使えます。
日時型にはDATE、TIME、TIMESPAMPがあり、そのほかにBLOB、CLOB、BOOLEANもあります。
ちなみにCHARやVARCHARは最大文字数を省略できません。いわゆるTEXT型ではないので、その点だけは注意が必要です。
特にCREATE TABLE文の末尾の列に最大文字数を書き忘ると「Unknown Token: )」というエラーになるので、
エラーの意味に延々悩むかもしれません。
Firebirdには、なんとOracleでいうSQL*Loaderとか、他のオープンソースRDBMSが大抵内蔵で備えている、
CSVなどのテキストファイルからコマンドラインでデータをロードする機能がありません。
なんでないの?と言われてもないんだからしょうがない。
おそらくGUIベースの管理ツールが古くから発達した製品だったため、CUIのツールを持つ必要がなかったのでしょう。
従って、PythonやJavaなどの言語でツールを自作するか、またはサードパーティーのGUIツールを使うことになりましょう。
Firebirdに接続するPythonプログラムを書くには、firebird-driver モジュールを入れます。
pip install firebird-driver
さすが老舗。何にも迷うことなくプログラムを書いて実行できました。
from firebird.driver import connect
conn = connect('localhost:/var/lib/firebird/data/mydb.fdb', user='TESTUSER', password='testpass', charset = 'utf8')
cur = conn.cursor()
cur.execute("SELECT NAME, SCORE FROM SCORES")
for row in cur:
print("%s, %s" %(row))
cur.close()
conn.close()
FirebirdのJDBCドライバはJaybirdという名前で、
このリンクからダウンロードできます。
マニュアルはこちら。
package test.jdbc;
import java.sql.*;
public class FirebirdJdbcTester {
public static void main(String args[]) {
Connection conn = null;
Statement stmt = null;
try {
Class.forName("org.firebirdsql.jdbc.FBDriver");
conn = DriverManager.getConnection(
"jdbc:firebird://firebird.nsnhnkmmkk.co.jp:3050//var/lib/firebird/data/mydb.fdb?encoding=UTF8",
"testuser", "testpass");
stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("SELECT * FROM SCORES");
while (rset.next()){
System.out.println(rset.getString(1) + "\t" + rset.getString(2));
}
System.out.println("Your JDBC installation is correct.");
rset.close();
} catch(Exception ex) {
ex.printStackTrace();
} finally {
try {
stmt.close();
conn.close();
} catch(SQLException ex) {
ex.printStackTrace();
}
}
}
}
注意点が二つ、共にJDBCのURLにあります。スラッシュが"//"と二重になっていますが、
これはポートとデータベースのパスを区切るスラッシュと、データベースの絶対パスの先頭部分としてのスラッシュで、
それぞれ別の意味なので省略できません。
もう一つは、末尾のencodingです。Jaybird JDBCドライバでは、encodingの省略時値はUTF8ではありません。
UTF-8でもWindows-31J(MS932)でもない、NONEという別の何かになります。
これだとUTF8を指定した別のクライアントから読みだすと大抵文字化けしてしまいます。従って毎回指定が必須と考えた方が良いと思います。
|
|
|
もくじ
|
|
Firebird
|
|
(C) 2002-2025 MISUMI URANO (2024/12/29 - 2025/01/04)
|