Python および Node.js 用の ODBC サポート
ここで説明するオープン・ソース・モジュールは、Python および Node.js 用の言語固有の ODBC インタフェースを提供します。
-
pyodbc Python ODBC ブリッジのサポート — pyodbc は Python DB API 2.0 仕様を実装します。
-
Node.js リレーショナル・アクセスのサポート — node-odbc は、Node.js クライアント・アプリケーションの ODBC データベース・アクセスを可能にします。
pyodbc Python ODBC ブリッジのサポート
pyodbc は、DB API 2.0 仕様 (PEP 249 -- Python Database API Specification v2.0Opens in a new tab) を実装し、ODBC を活用して基盤となるデータベースにアクセスするオープン・ソース Python モジュールです。インターシステムズでは、リレーショナル・パラダイムを使用して Python からデータベースにアクセスする手段として、pyodbc の使用をサポートしています。このモジュールは、前のバージョンの InterSystems IRIS でも使用できます。一般情報は、pyodbc の GitHub サイトOpens in a new tabを参照してください。
DB API 2.0 のインターシステムズ固有の実装が InterSystems IRIS 2022.1 で導入されており ("Native SDK for Python の使用法" の “Python DB-API の使用法” を参照)、これをすべての新しい Python 開発で使用することが推奨されています。pyodbc 実装は引き続きサポートされ、古いバージョンの InterSystems IRIS に接続するクライアント・アプリケーションで必要となる場合があります。
インストール
Windows 向けおよび Linux および関連オペレーティング・システム向けのインストール情報が掲載されているサイトがいくつかあります。
-
pyodbc の GitHub サイト : pyodbc Python ODBC bridgeOpens in a new tab
-
pyodbc Wiki : Wiki HomeOpens in a new tab
-
Microsoft 製品への pyodbc のインストール : Python SQL Driver - pyodbcOpens in a new tab
-
一般的な Python のドキュメント : PythonOpens in a new tab
インストール手順はシンプルです。
-
Python ダウンロード・ページOpens in a new tabから Python 2 または 3 (Unicode をサポート) をインストールします。
-
パスに Python を含むコンソールから、以下を実行します。
pip install pyodbc
macOS X へのインストール
macOS X へのインストールは、UNIX® プラットフォームとほぼ同じです ("Python Releases for Mac OS XOpens in a new tab" を参照)。
-
homebrewOpens in a new tab をインストールします。
-
unixODBCOpens in a new tab をインストールします。
-
pip install を実行します。
pip install --upgrade --global-option=build_ext --global-option="-I/usr/local/include" --global-option="-L/usr/local/lib"
テスト・プログラム
以下のテスト・プログラムは、pyodbc を使用して InterSystems IRIS データベースにアクセスする方法を示しています。InterSystems ODBC ドライバでサポートされる接続キーワードを示した例については、“ODBC 初期化ファイルの構造” を参照してください。
import pyodbc
import time
input("Hit any key to start")
dsn = 'IRIS Samples'
server = '127.0.0.1'
database = 'USER'
username = '_SYSTEM'
password = 'SYS'
#cnxn = pyodbc.connect('DRIVER={InterSystems ODBC35};SERVER='+server+';
# PORT='+port+'; DATABASE='+database+';UID='+username+';PWD='+ password)
cnxn = pyodbc.connect('DSN='+dsn+';')
lowptr=cnxn.getinfo(127)
highptr=cnxn.getinfo(136)
#value = PyLong_FromUnsignedLongLong(lowptr)
#print("%#5.8x"% (value))
print ("Connection high pointer: ")
print (format(highptr, '02x'))
print ("Connection high pointer: ")
print("%#5.8x"% (highptr))
print ("Connection low pointer: ")
print("%#5.8x"% (lowptr))
cursor = cnxn.cursor()
start= time.perf_counter()
#Sample select query
cursor.execute("SELECT * from Sample.Person")
row = cursor.fetchone()
#while row:
# print(row)
# row = cursor.fetchone()
end= time.perf_counter()
print ("Total elapsed time: ")
print (end-start)
input("Hit any key to end")
以下のように変更することで、Unicode データが返されなくなり、UTF-8 データが直接返されます。
cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='latin1')
cnxn.setencoding(str, encoding='latin1')
ここでは、対象を絞ったドライバを使用することで、ドライバ・マネージャが UCS-2 または UCS-4 の Unicode を使用するのを回避すると共に、特定のドライバ・マネージャの構築方法に合ったドライバを提供することによる複雑さを回避します。他の Unicode オプションについては、pyodbc Wiki の Unicode のセクションOpens in a new tabを参照してください。
Node.js リレーショナル・アクセスのサポート
node-odbc オープン・ソース Node.js モジュールは、Node.js クライアント・アプリケーションの ODBC データベース・アクセスを可能にします。node-odbc のサイト (https://github.com/wankdanker/node-odbcOpens in a new tab) によると、このモジュールは “unixODBC とそのサポート対象ドライバに対する node.js 用の非同期/同期インタフェース” ですが、Windows でも Windows ドライバ・マネージャと連携して機能します。InterSystems IRIS は、どちらのプラットフォームでも node-odbc をサポートしています。
依存関係
-
InterSystems ODBC ドライバ
このドライバは、InterSystems IRIS のインストール時に既定でインストールされます。
-
Node.js および npm
Node.js バージョン 8 以降がインストールされていることを確認してください。npm は通常、Node.js と共にインストールされます。
-
node-odbc
node-odbc パッケージは npm を使用して入手することも、Github からローカルにインストールすることもできます。詳細は、Github の node-odbc のサイト (https://github.com/wankdanker/node-odbcOpens in a new tab) を参照してください。
node-odbc を構築するには、以下のパッケージが必要です。
-
node-gyp
node-odbc はソースとして提供されており、node-gyp を使用して npm コマンドで構築します。npm を使用して node-odbc をインストールすると、node-gyp もインストールされることがあります。インストールされない場合は、インストール方法の詳細を node-gyp のサイト (https://www.npmjs.com/package/node-gypOpens in a new tab) で参照してください。
OS または Linux ディストリビューションによっては、node-gyp で node-odbc モジュールを構築するために必要な開発ツールのインストールが必要になることがあります。ここでは、必要なツールやそのインストール方法については説明しません。詳細は、node-gyp および node-odbc のインストール手順を参照してください。
-
Python および関連する開発ツール
Python は node-gyp の必要条件です。本書の執筆時点では、node-gyp は Python 2.7 に依存していますが、これは、将来 node-gyp の新バージョンが利用可能になったら変わる可能性があります。
-
-
unixODBC (Linux/UNIX のみ)
Linux で node-odbc を使用するには unixODBC ドライバ・マネージャが必要であり、これはほとんどの Linux ディストリビューションで標準で提供されています。システムにまだインストールされていない場合は、お使いのディストリビューションのインストール手順を参照してください。unixODBC のサイト (http://www.unixodbc.org/Opens in a new tab) からダウンロードすることもできます。
インストールとセットアップ
-
すべての依存関係を確実にインストールします。
-
Node.js と npm (https://nodejs.org/en/download/Opens in a new tab) — Node.js バージョン 8 以降がインストールされていることを確認してください。npm も必要であり、通常は Node.js と共にインストールされます。ノード・モジュールを npm を使用してローカルにインストールするか、グローバルにインストールするかを決定します。ローカル・インストールの最初のステップは、プロジェクト・フォルダを定義し、そのフォルダに移動して 'npm init' を実行することです (以下のセクションの例を参照)。
-
node-gyp (https://www.npmjs.com/package/node-gypOpens in a new tab) — node-odbc を構築するには、このパッケージが必要です。node-gyp はグローバルにインストールするのが適切ですが、ローカル・インストールでも機能します。どちらのケースでも、node-gyp には Python 2.7 も必要です。
-
node-odbc (https://github.com/wankdanker/node-odbcOpens in a new tab) — リンク・ページに記載されている手順を使用して、システムにインストールします。これは、IRIS ODBC 用に再構築する必要があるため、多くの場合はローカルにインストールする必要があります。
-
-
UNICODE サポートを削除して、node-odbc を再構築します。./node_modules/odbc/binding.gyp を編集して、'defines' 配列の 'UNICODE' をコメント・アウトします。変更された binding.gyp を保存して、プロジェクト・フォルダで 'npm rebuild' を実行します。
-
適切な InterSystems ODBC DSN が定義されていることを確認します。Windows では、データ ソース アドミニストレーターを使用できます (“Windows での ODBC データ・ソースの定義” を参照)。Windows 以外のプラットフォームでは、ODBCINI 環境変数を必要な odbc.ini ファイルの場所に定義します (“UNIX® での ODBC データ・ソースの定義” を参照)。これは、node-odbc モジュールをロードする前に JavaScript で定義することもできます。
Ubuntu でのインストールとセットアップの例
このサンプルでは、システムに Node.js と npm がインストール済みであると想定しています。npm を使用して node-odbc をインストールすると、node-gyp もインストールされることがあります。node-odbc を構築する前に、node-gyp モジュールとその依存関係がインストールされている必要があります。
npm init の各種オプションでは既定値を使用してかまいません。
~$ mkdir my_odbc
~$ cd my_odbc
~/my_odbc$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (my_odbc)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /home/your_home/my_odbc/package.json:
{
"name": "my_odbc",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Is this OK? (yes)
~/my_odbc$
~/my_odbc$ npm ls node-gypnpm ls node-gyp
my_odbc@1.0.0 /home/your_home/my_odbc
└── (empty)
~/my_odbc$ npm install node-gyp --save
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN my_odbc@1.0.0 No description
npm WARN my_odbc@1.0.0 No repository field.
+ node-gyp@3.8.0
added 97 packages from 67 contributors and audited 183 packages in 6.749s
found 0 vulnerabilities
~/my_odbc$
/my_odbc$ npm install odbc
> odbc@1.4.5 install /home/your_home/my_odbc/node_modules/odbc
> node-gyp configure build
make: Entering directory '/home/your_home/my_odbc/node_modules/odbc/build'
CXX(target) Release/obj.target/odbc_bindings/src/dynodbc.o
SOLINK_MODULE(target) Release/obj.target/odbc_bindings.node
COPY Release/odbc_bindings.node
make: Leaving directory '/home/your_home/my_odbc/node_modules/odbc/build'
npm WARN my_odbc@1.0.0 No description
npm WARN my_odbc@1.0.0 No repository field.
+ odbc@1.4.5
added 4 packages from 10 contributors and audited 187 packages in 6.187s
found 0 vulnerabilities
~/my_odbc$
上記によって警告が大量に生成されることがありますが、パッケージが正常に追加されている限り、無視してかまいません。
./node_modules/odbc/binding.gyp を編集して、UNICODE サポートを削除します。
$/my_odbc$ nano ./node_modules/odbc/binding.gyp
定義セクションが以下のようになっていることを確認します。
'defines' : [
# 'UNICODE'
],
次に、node-odbc を再構築します。
~/my_odbc$ npm rebuild
このコマンドによって警告が多数生成されることがありますが、無視してかまいません。エラーが発生しておらず、新しいモジュールが正常にリンクされたことを確認します。
以下の JavaScript コードを使用して、ODBC 接続をテストできます。この手順では、InterSystems IRIS サーバが実行されていて、DSN が適切に定義されている必要があります。
// update this line to reference the location of irisodbc.ini on your system
process.env.ODBCINI = process.env.ODBCINI || '/opt/isc/iris/inat/mgr/irisodbc.ini';
var db = require("odbc")();
let cn = 'DSN=';
if (process.platform == "win32") {
// Windows
cn += 'Sampleodbc;';
} else if (process.platform == "darwin") {
// Mac OS
cn += 'Userunixodbc;';
} else if (process.platform == "linux") {
cn += 'Userunixodbc;';
}
console.log(cn);
db.open(cn, function (err) {
if (err) {
return console.log(err);
}
console.log('I am connected') ;
db.query('select * from sample.person where id<3', function cb(err, data) {
if (err) {
console.error(err);
} else {
console.log(data);
}
});
db.close(function () { });
});
このコードは、DSN で指定されたネームスペースで Sample.Person クラスが定義およびコンパイルされ、3 未満の ID 値を持つデータがあると想定しています。
~/my_odbc$ node index.js
~/my_odbc$ node sample.js
DSN=Userunixodbc;
I am connected
[ { ID: 1,
Age: 3,
DOB: '2015-09-28',
FavoriteColors: '',
Name: 'Ulman,George L.',
SSN: '293-31-5406',
Spouse: 0,
Home_City: 'Newton',
Home_State: 'MI',
Home_Street: '6958 Main Avenue',
Home_Zip: '20649',
Office_City: 'Xavier',
Office_State: 'NY',
Office_Street: '7313 Madison Avenue',
Office_Zip: '73226' },
{ ID: 2,
Age: 16,
DOB: '2002-04-07',
FavoriteColors: 'Green',
Name: 'Pascal,Vincent A.',
SSN: '973-94-3185',
Spouse: 0,
Home_City: 'Xavier',
Home_State: 'ND',
Home_Street: '3788 Madison Drive',
Home_Zip: '80569',
Office_City: 'Washington',
Office_State: 'SC',
Office_Street: '1206 Second Place',
Office_Zip: '37389' } ]
~/my_odbc$