2022/01/14

Python連携

マークデータをDBへ書き込み

このコンテンツでは、マークデータをDBへ書き込みする方法について説明していきます。なお、本コンテンツで利用したSpotfireのバージョンは10.10/11.4です。ご利用環境によって、一部画面構成が異なる可能性がありますので、ご了承ください。

サンプルデータ

本コンテンツで利用するサンプルデータは、こちらからダウンロードしてください。

SpotfireからDBへ書き込み

Pythonを使って、Spotfireで解析して絞り込んだデータをデータベースに書き込みます。
Pythonとはデータ分析を実装する際によく使われるプログラミング言語です。Spotfireで使えるPythonには以下の2種類があります。

①テキストエリアなどで使えるironPython
②データ関数で使えるPython 3.7.5(ver10.10 LTS)

今回は、①のironPythonによる実装になります。

実行イメージ

Pythonスクリプトを使用して、Spotfireのマーク済みのデータをSQL Serverに書き込みます。
具体的には、散布図でマークした範囲の選手名を、ボタンを押してSQL Serverのテーブルに書き込むという操作になります。
下図のように、サラリーが高いのにホームランをあまり打っていない人を選択して、DBに記録します。

ボタンを押すとPythonがSQL ServerにInsertして、処理内容をメッセージボックスで通知します。

実行後のデータテーブルを確認すると、4人分入っていることがわかります。

テーブル定義

書き込み先のテーブルはBaseballRecordという名前で1カラムだけ用意しました。コードは下記になります。

CREATE TABLE [dbo].[BaseballRecord](
  [Name] [varchar](50) NULL
) ON [PRIMARY]

GO

ボタンの設定

テキストエリアでボタンの設定を行います。右上の鉛筆アイコンから「テキストエリアを編集」画面を表示します。

「アクションコントロールの挿入」ボタンを選択します。

スクリプト内で「コントロールのタイプ」を「ボタン」にして、「新規」を選択します。

「スクリプトの編集」画面で以下を入力します。

  • スクリプト名:DB書き込み
  • スクリプト:下記を入力

※データベースの接続情報は環境に合わせて変更してください。

import clr
clr.AddReference('System.Data')
from System.Data import *
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import MessageBox
from Spotfire.Dxp.Data import DataValueCursor

#SQL Server Setting
TheConnection = SqlClient.SqlConnection("server=[server名];database=[DB名];uid=[ユーザー名];password=[パスワード]")
TheConnection.Open()

#マークされた行からデータを抽出
myCursor = DataValueCursor.CreateFormatted(Document.Data.Tables["Baseball"].Columns["Player Name"])
markedRows = Document.Data.Markings["マーク"].GetSelection(Document.Data.Tables["Baseball"]).AsIndexSet()

totalCount = 0

#SQL Serverへアクセス
for row in Document.Data.Tables["Baseball"].GetRows(markedRows, myCursor):
  print myCursor.CurrentValue

#処理SQLの作成と実行
  sqlcmd = "insert into BaseballRecord values ( '" + myCursor.CurrentValue +"')"
  MyAction = SqlClient.SqlCommand( sqlcmd, TheConnection)
  totalCount += MyAction.ExecuteNonQuery()

TheConnection.Close()
MessageBox.Show( str(totalCount) + "人分追加しました。")

「スクリプトの実行」を選択して、下図のメッセージがポップアップされたら、OKを押します。

表示テキストに「DB書き込み」を設定し、「使用できるスクリプト」から対象を選択後、OKを押します。

「テキストエリアを編集」画面に戻り、保存することで設定は完了です。

散布図内で任意の範囲を選択後、DB書き込みボタンを押すことで、接続中のDBに選手名が書き込まれます。

データテーブルの更新

Insert対象のBaseballRecordテーブルをデータテーブルとして追加し、ボタンを押した後にデータテーブルが更新されるようにスクリプトを改良します。
これにより、ボタンを押した後にSpotfire内で追加データを確認できます。

インDB接続でSQL Serverにある対象のデータテーブルを取得します。オーサリングバーの⊕ボタンより、接続先 >> Microsoft SQL Server >> 新規接続を選択します。

接続設定を行います。

接続内のビュー内でBaseballRecordを選択します。

新規データテーブルとして取得したBaseballRecordのテーブルを散布図の近くに配置します。

先ほどのスクリプトに数行(灰色でハイライトされた箇所)を追加します。

import clr
clr.AddReference('System.Data')
from System.Data import *
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import MessageBox
from Spotfire.Dxp.Data import DataValueCursor

#テーブルリフレッシュ用に追加
from Spotfire.Dxp.Data import *
from Spotfire.Dxp.Data.Import import *

#SQL Server Setting
TheConnection = SqlClient.SqlConnection("server=[server名];database=[DB名];uid=[ユーザー名];password=[パスワード]")
TheConnection.Open()

#マークされた行からデータを抽出
myCursor = DataValueCursor.CreateFormatted(Document.Data.Tables["Baseball"].Columns["Player Name"])
markedRows = Document.Data.Markings["マーク"].GetSelection(Document.Data.Tables["Baseball"]).AsIndexSet()

totalCount = 0

#SQL Serverへアクセス
for row in Document.Data.Tables["Baseball"].GetRows(markedRows, myCursor):
  print myCursor.CurrentValue

#処理SQLの作成と実行
  sqlcmd = "insert into BaseballRecord values ( '" + myCursor.CurrentValue +"')"
  MyAction = SqlClient.SqlCommand( sqlcmd, TheConnection)
  totalCount += MyAction.ExecuteNonQuery()

TheConnection.Close()
MessageBox.Show( str(totalCount) + "人分追加しました。")

# データテーブルの更新
Document.Data.Tables["BaseballRecord"].Refresh()

任意の範囲を選択してボタンを押し、少し待つとテーブルが更新され、選択したデータの選手名が追加されます。

【Python連携】記事一覧に戻る
全記事一覧に戻る