# coding: utf-8
from commons.datamapping import DataMapping
from commons.dynamicapp import DynamicApp
from database.database import Database
[ドキュメント]
class Model():
"""
モデルクラス。SQLを実行する。
Attributes
----------
log : mlog
datamapping : DataMapping
dynamicapp : DynamicApp
database : Database
requestdict : dict
画面からのリクエストデータ
parallel_flag : ?
parallel_end : ?
"""
def __init__(self, mlog, mlogname, dlog, dlogname, requestdict):
try:
self.mlog = mlog
self.mlogname = mlogname
self.mlog.debug(self.mlogname, 'Model init start')
# 利用する外部クラスをインスタンス
self.datamapping = DataMapping()
self.dynamicapp = DynamicApp()
self.dlog = dlog
self.dlogname = dlogname
self.database = Database(self.dlog, self.dlogname)
# インスタンス変数を設定
self.requestdict = requestdict
except Exception as e:
self.mlog.error(self.mlogname, f'Model init exception message : {e}')
finally:
self.mlog.debug(self.mlogname, 'Model init end')
[ドキュメント]
def fromRequestToSql(self, sqldict, temp_object):
"""
SQL実行処理1(SQLデータからsql配列を取り出し実行する)
Parameters
----------
sqldict : dict
SQLデータ(sql.json)
temp_object : Class
サーバプログラム実行用のモデルオブジェクト -> AppCache.getModelObject() の戻り値
"""
try:
for sql_info in sqldict['sqls']:
self.mlog.debug(self.mlogname, f'Model fromRequestToSql sql_info : {sql_info}')
# sql入力レコードの編集
self.editSqlInputData(sql_info, sqldict)
# beforeメソッド処理
result = self.dynamicapp.doBeforeAfterMethod('before', sql_info, temp_object)
if result in('ERROR', 'ALLPASS'):
return
# SQLの実行
if result == 'OK':
self.doSql(sql_info, sqldict)
if sqldict['message']['status'] == 'ERROR':
return
# afterメソッド処理
result = self.dynamicapp.doBeforeAfterMethod('after', sql_info, temp_object)
if result in('ERROR', 'ALLPASS'):
return
except Exception as e:
self.mlog.error(self.mlogname, f'Model fromRequestToSql exception message type : {str(type(e))}')
self.mlog.error(self.mlogname, f'Model fromRequestToSql exception message arg : {str(e.args)}')
self.mlog.error(self.mlogname, f'Model fromRequestToSql exception message : {e}')
[ドキュメント]
def doSql(self, sql_info, sqldict):
"""
SQL実行
Parameters
----------
sql_info : dict
SQLデータの中の'sqls' の1要素 -> sqldict['sqls'][i]
sqldict : dict
SQLデータ(sql.json)
"""
# 接続するDBを設定(デフォルトはsqldict['dbname'])
dbname = sqldict['dbname']
if 'dbname' in sql_info:
if sql_info['dbname'] != '':
dbname = sql_info['dbname']
# SQL実行(nosql が指定されている場合はスキップ)
if sql_info['sql']['type'] != 'nosql':
self.database.doSql(dbname, sql_info)
# SQL実行後チェック処理
if 'check' in sql_info['sql']:
self.database.recordCheck(sql_info, sqldict)
[ドキュメント]
def call(self, json_cache, app_cache):
"""
メイン処理(MainModel から呼び出される)
Parameters
----------
json_cache : dict
SQL定義情報のキャッシュ -> JsonCache("sql.json")
app_cache : dict
モデルAPPのキャッシュ -> AppCache("model.py")
Returns
-------
sqldict : dict
SQL実行後のSQLデータ
"""
try:
self.mlog.debug(self.mlogname, 'Model: call start')
# SQLデータを設定
self.mlog.debug(self.mlogname, 'Model: SQLデータを設定 start')
sqldict = json_cache.getJsonData(self.requestdict)
self.mlog.debug(self.mlogname, 'Model: SQLデータを設定 end')
# サーバプログラム実行用のモデルオブジェクトを動的生成
self.mlog.debug(self.mlogname, 'Model: モデルオブジェクトを動的生成 start')
#temp_object = app_cache.getModelObject(sqldict, self.requestdict) 2021/06/19
temp_object = app_cache.getModelObject(self.database, sqldict, self.requestdict)
self.mlog.debug(self.mlogname, 'Model: モデルオブジェクトを動的生成 end')
# SQLデータからSQL文を作成して実行
self.mlog.debug(self.mlogname, 'Model: SQLデータからSQL文を作成して実行 start')
self.fromRequestToSql(sqldict, temp_object)
self.mlog.debug(self.mlogname, 'Model: SQLデータからSQL文を作成して実行 end')
self.mlog.debug(self.mlogname, 'Model: SQL実行エラー判定')
if sqldict['message']['status'] == 'OK':
self.mlog.debug(self.mlogname, 'Model: SQL実行 OK コミットを実行')
self.database.commit()
else:
self.mlog.debug(self.mlogname, 'Model: SQL実行 エラー ロールバックを実行')
self.database.rollback()
# SQLデータをリターン
return sqldict
except Exception as e:
self.mlog.error(self.mlogname, f'Model call exception message : {e}')
sqldict['message']['status'] = 'ERROR'
sqldict['message']['msg'] = e
return sqldict
finally:
# コネクションをクローズ
self.mlog.debug(self.mlogname, 'Model: コネクションをクローズ')
self.database.close()
self.mlog.debug(self.mlogname, 'Model: call end')