Scriptella ETL 快速上手 ^^^^^^^^^^^^^^^^^^^^^^^ - 作者:臭豆腐[trydofor.com] - 日期:2010-07-07 - 授权:署名-非商业-保持一致 1.0 协议 - 声明:拷贝、分发、呈现和表演本作品,请保留以上全部信息。 0. 文档目录 ^^^^^^^^^^^ [[<=$INDEX]] 1. Scriptella 预备知识 ^^^^^^^^^^^^^^^^^^^^^^ 官方网站:http://scriptella.javaforge.com/ 许可证:Apache License, Version 2.0 当前版本:Scriptella 1.0 Released (May 5, 2010) 系统需求:JRE 5.0+ (有些driver要求更高JRE,如JSR 223,要JRE6) 典型应用:(官方资料的简译) * 执行 SQL,JS,JEXL,Velocity等脚本。 * 数据库迁移。LDAP,JDBC,XML等数据源的协作。 * 跨DB的ETL操作,以CSV,文本,XML等格式的导入导出。 * 作为Ant的一个task。 * Db Schema 的自动升级。 官方文档: * 略读,快速入门:http://scriptella.javaforge.com/tutorial.html * 细读,常见问题:http://scriptella.javaforge.com/faq.html * 研究,参考手册:http://scriptella.javaforge.com/reference/index.html * 理解,API 文档:http://scriptella.javaforge.com/docs/api/index.html * 了解,HOWTOs: 这个目前有两个,看看即可。 * 即用即查,驱动帝国:http://scriptella.javaforge.com/reference/drivers.html 2. Scriptella 常用示例 ^^^^^^^^^^^^^^^^^^^^^^ 以下示例都是官方网站中比较有代表性的。 这里只是进行了简单的集中和部分注释。 2.1. JavaScript的使用 ^^^^^^^^^^^^^^^^^^^^^ [[官方地址<=http://scriptella.javaforge.com/docs/api/scriptella/driver/script/package-summary.html]] The following query executes a child script 10 times. As the result of execution 10 records are inserted into a database table. Additionally a log file log.txt is produced. 简译:下面的Query执行了10次内嵌Script。 效果是,在DB中插入了10条记录,并产生日志log.txt。 ================ xml: 完整的ETL文件 ================ <?xml version="1.0" encoding="UTF-8"?> <!-- 指定编码,防止系统弄错字符集 --> <!DOCTYPE etl SYSTEM "http://scriptella.javaforge.com/dtd/etl.dtd"> <etl> <connection id="script" driver="script"/> <connection id="out" driver="oracle" url="jdbc:oracle:thin:@localhost:1521:DB"/> <connection id="log" driver="script" url="log.txt"/> <query connection-id="script"> <![CDATA[ for (var i = 0; i < 10; i++) { login = 'login' + i; //You can instantiate Java objects and invoke static methods var now = new java.sql.Timestamp(java.lang.System.currentTimeMillis()); query.next(); //Executes a child script element // * 执行后续的所有元素 }]]> <!-- Inserts a parameterized row into a database --> <script connection-id="out"> INSERT INTO Table(ID, Login, Login_Time) VALUES (?i, ?login, ?now); </script> <!-- Logs the message using MessageFormat class and parent context variables --> <script connection-id="log"> // create Java String array of 2 elements var a = java.lang.reflect.Array.newInstance(java.lang.Object, 2) a[0] = now;a[1] = i; println(format.format(a)); >/script> </query> </etl> ==================================================== 2.2. CSV文件的使用 ^^^^^^^^^^^^^^^^^^ [[官方地址<=http://scriptella.javaforge.com/docs/api/scriptella/driver/csv/package-summary.html]] ================ xml: ETL文件片段 ================== <connection id="in" driver="csv" url="data.csv" /> <connection id="out" driver="csv" url="report.csv"> #Use empty quote to turn off quoting quote= separator=; </connection> <!-- connection里面可以设置参数,各个connection不一样 --> <script connection-id="out"> ID,Priority,Summary,Status </script> <query connection-id="in"> <!--Empty query means select all--> <script connection-id="out"> $rownum,$priority,$summary,$status </script> </query> ==================================================== ================= txt: data.csv ==================== priority,summary,status 11,summary1,21 12,summary1,22 ==================================================== ================ txt: report.csv =================== ID;Priority;Summary;Status 1;11;summary1;21 2;12;summary1;22 ==================================================== 解说: $priority,$summary,$status,就是CVS的头(首行) priority,summary,status。 2.3. 文本文件的使用 ^^^^^^^^^^^^^^^^^^^ [[官方地址<=http://scriptella.javaforge.com/docs/api/scriptella/driver/text/package-summary.html]] 大部分时候,我们处理文本,用到Text Driver,然后用正则表达式匹配行划分组。示例比较简单。 2.4. 发送邮件的使用 ^^^^^^^^^^^^^^^^^^^ [[官方地址<=http://scriptella.javaforge.com/docs/api/scriptella/driver/mail/package-summary.html]] ================ xml: HTML邮件 ================== <etl> <connection driver="mail" url="mailto:user@nosuchhost.com?subject=Hello" classpath="mail.jar:activation.jar"> type=html mail.smtp.host=mail.host.name mail.user=user mail.password=password mail.from=Firstname Lastname <user@nosuchhost.com> </connection> <script><![CDATA[ <html> <body> Hello, <hr> <a href="http://scriptella.javaforge.com/" title="Powered by Scriptella ETL"> <img src="http://scriptella.javaforge.com/images/scriptella-powered.gif" width="88" height="31" border="0" alt="Powered by Scriptella ETL"> </a> </body> </html>]]> </script> </etl> ==================================================== ================ xml: 动态发邮件 ================== <etl> <connection id="mail" driver="mail" url="mailto:$email?subject=Hello $name" classpath="mail.jar:activation.jar"> mail.smtp.host=mail.host.name mail.user=user mail.password=password mail.from=Administrator <user@nosuchhost.com> </connection> <connection id="db" .../> <query connection-id="db" > SELECT * FROM Users <script connection-id="mail"> #$rownum Message produced by Scriptella ETL </script> </query> </etl> ==================================================== 2.5. M$ Excel的使用 ^^^^^^^^^^^^^^^^^^^ [[官方地址<=http://scriptella.javaforge.com/docs/api/scriptella/driver/xls/package-summary.html]] 把 Excel当Db使用,因为是JDBC驱动。 ================ xml: ETL文件片段 ================== <connection id="xls" url="jdbc:xls:file:report.xls" classpath="sqlsheet-0.1.0.jar; poi-3.0.2-FINAL-20080204.jar; jsqlparser.jar" /> <script connection-id="xls"> CREATE TABLE SHEET1( COL1 INT, COL2 INT ); </script> ... <query connection-id="db"> ... <script connection-id="xls"> INSERT INTO SHEET1 (COL1,COL2) VALUES(${rownum},${col2_value}); </script> </query> ==================================================== 3. Scriptella 注意事项 ^^^^^^^^^^^^^^^^^^^^^^ * query标签,只能用来查询数据,UPDATE,INSERT,DELETE要用Script。 * if="priority == $priority",query/script属性if里变量的使用。 * INSERT INTO $TABLE2 VALUES (?V1, ?{V2+V3}) 变量的使用方法和作用。 * 变量的作用域是自身和子标签,父标签的同名变量被隐藏。