首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Liquibase: changeset自动生成ID

Liquibase: changeset自动生成ID
EN

Stack Overflow用户
提问于 2017-01-04 13:40:02
回答 2查看 10.5K关注 0票数 5

如何用液碱自动生成变送器ID?

我不想手动设置每个变更集的ID,是否有一种自动设置的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-17 08:22:45

我认为生成的ids不是一个好主意。原因是液化库使用changeSet id来计算校验和(除了作者和fileName)。因此,如果您在其他人之间插入一个changeSet,则所有后续changeSets的校验和将发生变化,您将得到大量警告/错误。

无论如何,如果您仍然希望生成if,我可以考虑这些解决方案:

  1. 创建自己的ChangeLogParser

如果您自己解析ChangeLog,那么您可以自由地生成您想要的ids。缺点是您必须为changeLog提供一个自定义Xml。来自Liquibase的架构对changeSet ids有一个约束(必需)。使用新的模式,您可能需要对解析器进行大量的调整。或者,您可以选择另一种changeLog格式(YAML、JSON、Groovy)。他们的解析器可能更容易定制,因为他们不需要那个模式定义。

  1. 做一些预处理

您可以编写一个简单的xslt (Xml转换),从一个没有changeSet ids的文件中生成带有changeSet ids的Xml。

  1. 使用时间戳作为Ids

这将是我的建议。它不能以您所问的方式解决这个问题,但是它简单、一致,提供了额外的信息,并且是其他数据库迁移工具以及http://www.jeremyjarrell.com/using-flyway-db-with-distributed-version-control/的良好实践。

票数 2
EN

Stack Overflow用户

发布于 2019-05-13 15:20:58

我编写了一个Python脚本,将唯一的I生成到Liquibase changelogs中。

小心!

生成ID

  • 当变更列表正在开发或准备发布时
  • 或者控制目标数据库的校验和。

不要生成IDs -当已部署变更量时

代码语言:javascript
复制
"""
###############################################################################
Purpose: Generate unique subsequent IDs into Liquibase changelogs
###############################################################################

Args:
    param1:     Full Windows path changelog directory (optional) 
                OR
                --inplace: directly process changelogs (optional) 

    By default, XML files in the current directory are processed.

Returns:
    In case of success, the output path is returned to stdout. 
    Otherwise, we crash and drag the system into mordor.

    If you feel like wasting time you can: 
        a) port path handling to *nix 
        b) handle any obscure exceptions 
        c) add Unicode support (for better entertainment)

Dependencies:
    Besides Python 3, in order to preserve XML comments, I had to use lxml 
    instead of the stock ElementTree parser. 
    Install lxml:

    $ pip install lxml

    Proxy clusterfuck? Don't panic! Simply download a .whl package from: 
    https://pypi.org/project/lxml/#files and install with pip.

Bugs:
    Changesets having id="0" are ignored. Usually, these do not occur.    

Author:
    Tobias Bräutigam 

Versions:
    0.0.1 - re based, deprecated
    0.0.2 - parse XML with lxml, CURRENT 
"""

import datetime
import sys
import os
from pathlib import Path, PureWindowsPath

try:    
    import lxml.etree as ET
except ImportError as error:
    print (''' 
    Error: module lxml is missing.
    Please install it:

    pip install lxml
    ''')
    exit()

# Process arguments
prefix = '' # hold separator, if needed 
outdir = 'out'

try: sys.argv[1]
except: pass
else:
    if sys.argv[1] == '--inplace':
        outdir = ''
    else:                
        prefix = outdir + '//'
        # accept Windows path syntax
        inpath = PureWindowsPath(sys.argv[1]) 
        # convert path format
        inpath = Path(inpath) 
        os.chdir(inpath) 
        try: os.mkdir(outdir)
        except: pass
        filelist = [ f for f in os.listdir(outdir) ]
        for f in filelist: os.remove(os.path.join(outdir, f))

# Parse XML, generate IDs, write file 
def parseX(filename,prefix):    
    cnt = 0    
    print (filename)
    tree = ET.parse(filename)
    for node in tree.getiterator():
        if int(node.attrib.get('id', 0)):                        
            now = datetime.datetime.now()            
            node.attrib['id'] = str(int(now.strftime("%H%M%S%f"))+cnt*37)
            cnt = cnt + 1 
    root = tree.getroot()
    # NS URL element name is '' for Etree, lxml requires at least one character
    ET.register_namespace('x', u'http://www.liquibase.org/xml/ns/dbchangelog') 
    tree = ET.ElementTree(root)        
    tree.write(prefix + filename, encoding='utf-8', xml_declaration=True)
    print(str(cnt) +' ID(s) generated.')

# Process files
print('\n')
items = 0
for infile in os.listdir('.'):
    if (infile.lower().endswith('.xml')) == True:      
        parseX(infile,prefix)
        items=items+1

# Message
print('\n' + str(items) + ' file(s) processed.\n\n')
if items > 0:
    print('Output was written to: \n\n')    
    print(str(os.getcwd()) + '\\' + outdir + '\n')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41465227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档