Groovy
ORM
uroboroSQL

GroovyでuroboroSQLをさくっと試してみる

More than 1 year has passed since last update.

概要

Groovyスクリプトにて、オープンソースのuroboroSQLを試してみました。
uroboroSQLのドキュメントはこちら

サンプルのツリー構造

  • sqlはsqlフォルダ配下に配置する
$ tree .                                                                                                                              .
├── logback.xml
├── sql
│   ├── ddl
│   │   └── createTable.sql
│   └── dml
│       ├── delete.sql
│       ├── insert.sql
│       └── select.sql
└── uroborotest.groovy

実行するSQL

sql/ddl/createTable.sql
create table if not exists  address (
    id bigserial,
    name text,
    zip text
)
sql/dml/delete.sql
delete from address
sql/dml/insert.sql
insert into address(name,zip) values (/*name*/'',/*zip*/'')
sql/dml/select.sql
select id,name,zip from address
where name = /*name*/''

ログ設定

uroborosqlのレベルを変更(DEBUG)にすることにより、展開されたSQLやパラメータ等が詳細に表示されます

logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!-- logを標準出力に出力 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- ターゲットを標準出力へ -->
        <Target>System.out</Target>
        <!-- パターンレイアウト -->
        <encoder>
            <pattern>[%-5p] %m%n</pattern>
        </encoder>
    </appender>

    <logger name="jp.co.future.uroborosql" level="${LOGLEVEL}" />

    <appender name="CoverageLog" class="ch.qos.logback.core.FileAppender">
        <file>target/coverage.log</file>
        <append>true</append>
        <encoder>
            <pattern>%m%n</pattern>
        </encoder>
    </appender>

    <logger name="jp.co.future.uroborosql.coverage" level="TRACE"
            additivity="false">
        <appender-ref ref="CoverageLog" />
    </logger>


    <!-- ログ出力に関する設定 -->
    <root>
        <!-- 出力するレベルを設定 -->
        <level value="INFO" />

        <!-- アペンダを設定 -->
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

Groovyスクリプト

uroborotest.groovy
//@GrabConfig( systemClassLoader=true )
@Grab(group='jp.co.future', module='uroborosql', version='0.2.0') 
@Grab(group='org.postgresql', module='postgresql', version='42.1.3')
@Grab(group='ch.qos.logback', module='logback-classic', version='1.2.3')

import jp.co.future.uroborosql.* 
import jp.co.future.uroborosql.config.* 
import jp.co.future.uroborosql.store.* 

def url = "jdbc:postgresql://127.0.0.1:5432/dbname"
def usr = "user"
def psw = "password"

//Class.forName("org.postgresql.Driver")

// DB接続情報を設定
def config = DefaultSqlConfig.getConfig(url, usr, psw)
def sqlContextFactory = config.getSqlContextFactory()
sqlContextFactory.initialize();

// SqlAgentを作成
def agent = config.createAgent()

// テーブルを作成 (sqlファイルの指定では、拡張子は指定しない)
agent.update("ddl/createTable").count()

// データの削除
def count = agent.update("dml/delete").count()
println("$count rows deleted")

// 挿入するデータ
def params =  [ 
    [ name: 'Mr.Bean'      , zip: 'UK' ]
,   [ name: 'Mr.Nagashima' , zip: 'JP' ]
]

// データの更新(バッチモード)
def updater = agent.update("dml/insert")
params.each { 
    updater.paramMap(it)
    updater.addBatch()
}
def result = updater.batch()
println("${result.size()} rows created")


// データの選択
def selector = agent.query("dml/select")
selector.param("name","Mr.Nagashima").collect().each {
    println(it)
}

// 処理終了
agent.commit()
agent.close()

実行結果

-DLOGLEVELにINFO|DEBUG|TRACEのいずれかを指定することで、uroboroSQLのログレベルを調整できます

$ groovy --version                                                           
Groovy Version: 2.4.10 JVM: 1.8.0_121 Vendor: Oracle Corporation OS: Linux

$ groovy -DLOGLEVEL=DEBUG uroborotest.groovy
[DEBUG] Start loading SQL template.[/mnt/ramdisk/uroborosql/sql]
[DEBUG] Loading SQL template.[]
[DEBUG] Loading SQL template.[dml]
[DEBUG] Loading SQL template.[ddl]
[DEBUG] Executed SQL[
create table if not exists  address (
    id bigserial,
    name text,
    zip text
)
]
[DEBUG] Execute update SQL.
[DEBUG] SQL execution time [ddl/createTable] : [00:00:00.002]
[DEBUG] Executed SQL[
delete from address
]
[DEBUG] Execute update SQL.
[DEBUG] SQL execution time [dml/delete] : [00:00:00.000]
2 rows deleted
[DEBUG] Executed SQL[
insert into address(name,zip) values (?/*name*/,?/*zip*/)
]
[DEBUG] 2 items Added for batch process.
[DEBUG] Execute batch process.
[DEBUG] SQL execution time [dml/insert] : [00:00:00.002]
2 rows created
[DEBUG] Executed SQL[
select id,name,zip from address
where name = ?/*name*/
]
[DEBUG] Set the parameter.[INDEX[1], Parameter name[name], Value[Mr.Nagashima], Class[String]]
[DEBUG] Execute search SQL.
[DEBUG] SQL execution time [dml/select] : [00:00:00.008]
[ID:54, NAME:Mr.Nagashima, ZIP:JP]