我阅读了liquibase的最佳实践,特别是管理存储过程:
管理存储过程:尝试为存储过程维护单独的更改日志,并使用runOnChange =“true”。此标志强制LiquiBase检查变更集是否已修改。如果是这样,liquibase会再次执行更改。
他们的意思是"为存储过程维护单独的更改日志"?
我通常有一个与发布链接的更改日志目录。每个更改日志文件都包含在master.xml
。
在遵循他们的建议时,目录结构会是什么?
答案 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
答案 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;