はじめに
typescript+node.jsでSQLServerに接続するにはmssqlを使用します
インストール方法
npmでインストールします
npm install mssql --save
typescriptを使用するので型定義もインストールします
npm install @types/mssql --save-dev
使い方
データベースへの接続
import { ConnectionPool } from 'mssql';
const pool = new ConnectionPool({
user: '[ユーザーID]',
password: '[パスワード]',
database: '[データベース名]',
server: '[データベースのホスト]',
options: {
encrypt: true
}
});
pool.connect();
connect()はPromiseを返しますので、awaitを使って下記のようにできます
await pool.connect();
一連の処理を一つの関数にすると下記のようになります
const mssqlConnect = async () => {
const pool = new ConnectionPool({
user: '[ユーザーID]',
password: '[パスワード]',
database: '[データベース名]',
server: '[データベースのホスト]',
options: {
encrypt: true
}
});
await pool.connect();
return pool;
}
クエリの実行
const data = pool.request().query('SELECT * FROM [テーブル名]');
for (const row of data.recordset) {
console.log(row['カラム名']);
}
パラメータを指定する場合は下記のようにします
const request = pool.request();
request.input('id', 1); // パラメータを指定
const data = request.query('SELECT * FROM [テーブル名] WHERE ID = @id');
for (const row of data.recordset) {
console.log(row['カラム名']);
}
トランザクション
トランザクション開始
const transaction = new Transaction(pool);
await transaction.begin();
コミット
await transaction.commit();
ロールバック
await transaction.rollback()
クラス例
import {ConnectionPool, Transaction} from 'mssql';
export class MsSql {
private pool: ConnectionPool;
private transaction: Transaction;
/**
* 接続
* @param {string} host
* @param {string} user
* @param {string} password
* @param {string} database
* @returns {Promise}
*/
public async connect(host: string, user: string, password: string, database: string) {
this.pool = new ConnectionPool({
server: host,
user: user,
password: password,
database: database,
options: {
encrypt: true
}
});
await this.pool.connect();
}
/**
* トランザクション開始
* @returns {Promise}
*/
public async beginTransaction() {
this.transaction = new Transaction(this.pool);
await this.transaction.begin();
}
/**
* トランザクションコミット
* @returns {Promise}
*/
public async commit() {
await this.transaction.commit();
}
/**
* トランザクションロールバック
* @returns {Promise}
*/
public async rollback() {
await this.transaction.rollback();
}
/**
* クエリ実行
* @param {string} query
* @param parameters
* @returns {Promise>}
*/
public async query(query: string, parameters: {[key: string]: any} = {}) {
const request = this.pool.request();
for (const name in Object.keys(parameters)) {
request.input(name, parameters[name]);
}
return (await request.query(query)).recordset;
}
}