# 数据库版本控制

## 说明

hsweb使用nashorn来定义模块的初始化，更新脚本(`hsweb-starter.js`)。在模块首次引入,或者发生版本更新时，会执行对应的代码，利用此功能，可以实现对数据库的版本控制。

## 定义脚本

在模块的 resources下创建hsweb-starter.js. 内容如下:&#x20;

```
//组件信息
var info = {
    groupId: "org.hswebframework",
    artifactId: "hsweb-payment-pay",
    version: "1.0.2", //当前版本
    website: "http://payment.hsweb.io",
    author: "zhouhao",
    comment: "支付模块"
};

//版本更新信息
var versions = [
    {
        version: "1.0.1",//版本升级到1.0.1时执行
        upgrade: function (context) {
            var database = context.database;
            //增加渠道供应商
            database.createOrAlter("pay_order")
                .addColumn().name("channel_provider").varchar(128).notNull().comment("渠道供应商").commit()
                .addColumn().name("channel_provider_name").notNull().varchar(128).comment("渠道供应商名称").commit()
                .comment("支付订单表").commit();
        }
    },
    {
        version: "1.0.2", //版本升级到1.0.2时执行
        upgrade: function (context) {
            var database = context.database;
            database.createOrAlter("pay_order")
                .addColumn().name("comment").varchar(2048).comment("说明").commit()
                .comment("支付订单表").commit();
        }
    }
];
var JDBCType = java.sql.JDBCType;

//首次启动此模块的时候执行
function install(context) {
    var database = context.database;
    database.createOrAlter("pay_order")
        .addColumn().name("id").varchar(32).notNull().primaryKey().comment("ID").commit()
        .addColumn().name("order_id").varchar(128).notNull().comment("商户订单号").commit()
        .addColumn().name("merchant_id").varchar(128).notNull().comment("商户ID").commit()
        //.....省略了更多字段设置
        .addColumn().name("status").varchar(16).notNull().comment("订单状态").commit()
        .index().name("idx_order_id").column("order_id").unique().commit()//订单号唯一索引
        .index().name("idx_order_merchant_id").column("merchant_id").commit()
        .comment("支付订单表").commit();
}

function initialize(){
    //首次使用此模块，在全部依赖安装完成后执行
}

//以下为固定的代码,无需修改
dependency.setup(info)
    .onInstall(install)
    .onUpgrade(function (context) { //更新时执行
        var upgrader = context.upgrader;
        upgrader.filter(versions)
            .upgrade(function (newVer) {
                newVer.upgrade(context);
            });
    })
    .onUninstall(function (context) { //卸载时执行

    }).onInitialize(initialize); //初始化
```

## 执行流程

1. 在应用启动完成后,会获取所有的hsweb-starter.js文件。
2. 执行js并获取到模块信息。
3. 根据模块信息判断模块是否安装或者更新。
4. 执行对应的安装或者更新操作。
5. 如果模块是首次执行，将会在全部模块安装完成后执行初始化操作。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.hsweb.io/framework/zeng-shan-gai-cha/shu-ju-ku-ban-ben-kong-zhi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
