Liquibase存储了Proc的管理

时间:2016-10-12 02:49:56

标签: liquibase

我阅读了liquibase的最佳实践,特别是管理存储过程:

  

管理存储过程:尝试为存储过程维护单独的更改日志,并使用runOnChange =“true”。此标志强制LiquiBase检查变更集是否已修改。如果是这样,liquibase会再次执行更改。

他们的意思是"为存储过程维护单独的更改日志"?

我通常有一个与发布链接的更改日志目录。每个更改日志文件都包含在master.xml

在遵循他们的建议时,目录结构会是什么?

2 个答案:

答案 0 :(得分:10)

我们做的是这样的事情:

\---liquibase
    |   changelog.xml
    |   procedures.xml
    |   
    +---procedures
            procedure_one.sql
            procedure_two.sql

changelog.xml只包含procedures.xml。在procedures.xml内,我们有类似的内容:

<changeSet author="arthur" id="1" runOnChange="true" runInTransaction="true">
    <sqlFile path="procedures/procedure_one.sql"
             encoding="UTF-8"
             relativeToChangelogFile="true"
             endDelimiter=";"
             splitStatements="true"/>

</changeSet>

<changeSet author="arthur" id="2" runOnChange="true" runInTransaction="true">
    <sqlFile path="procedures/procedure_two.sql"
             encoding="UTF-8"
             relativeToChangelogFile="true"
             endDelimiter=";"
             splitStatements="true"/>

</changeSet>

当然runInTransaction="true"只有在您的DBMS支持事务性DDL时才有意义。

过程的每个SQL脚本都是自包含的,并使用create or replace重新创建过程。对于不支持create or replace的DBMS,我们通常在那里执行(条件)drop procedure; create procedure ...

通过明确包含文件(而不是使用includeAll),我们可以控制创建过程和函数的顺序(如果使用另一个,则很重要)。

如果添加新过程,则向procedures.xml

添加新的SQL脚本和新的changeSet

答案 1 :(得分:0)

@a_horse_with_no_name只能正确回答,并且还请您检查我错过的版本。我要补充他错过的内容。

这是您可以直接使用的示例过程文件(procedure_one.sql)。

from flask import Flask
from flask_restful import Resource, Api
from data import students

app = Flask(__name__)
api = Api(app)
class StudentDept(Resource):
    def get(self, dept):
        names=[]
        for student in students:
            names.append(student['name'])
            if student['dept']==dept:
                return {'studentnames':names}
        return {'studentnames':'None'}, 404

api.add_resource(StudentDept, '/student/name/<string:dept>')
app.run(port=5000, debug=True)

procedures.xml将如下所示

CREATE PROCEDURE `ivi_alter_column`() 
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
   ALTER TABLE `tableName` ADD COLUMN  `columnName` BIGINT(20) NULL;
END;