有没有一种方法可以在chagelogs附近存储实际的数据库方案?

时间:2019-08-28 11:41:48

标签: spring-boot liquibase

我已经为Spring Boot应用程序配置了liquibase迁移。现在,我有了一个chagelog文件夹,其中包含所有更改,并且我想使用当前数据库方案创建一个文件,因为它很方便。 liquibase是否具有在Spring Boot项目中存储实际数据库方案的最佳实践?

1 个答案:

答案 0 :(得分:1)

您的问题令人困惑。当您说“具有当前数据库方案的文件”时,您是在指具有数据的实际数据库(例如SQLite文件)还是用于创建数据库初始状态的脚本?

如果您想要的是实际数据库,那么这不是liquibase问题。您当然可以将数据库文件与脚本放在同一文件夹中,但这对我来说没有多大意义。应该将liquibase脚本视为源代码的一部分,该数据库是特定于执行环境的,并且可能在其他地方。

如果您希望脚本具有初始状态,那绝对可以使用liquibase来完成。所需的命令是generateChangeLog。这将分析您现有的数据库并生成一个更改日志以重新创建它。然后,您将其称为要在脚本中执行的第一个变更日志。

DECLARE @file NVARCHAR(MAX) = 'C:\Users\Win2K16\Desktop\affidavits.xml'
DECLARE @xml XML
DECLARE @results table (result XML)
DECLARE @sqlstmt NVARCHAR(MAX)

SET @sqlstmt= 'SELECT * FROM OPENROWSET ( BULK ''' + @file + ''', SINGLE_CLOB) AS xmlData'

INSERT INTO @results EXEC (@sqlstmt)
SELECT @xml = result FROM @results

--build an XML object with the unique list of nodes
DECLARE @xmlcolumns XML;
WITH Xml_CTE AS
(
    SELECT
        CAST('<' + node.value('fn:local-name(.)',
            'varchar(100)') + '>' AS varchar(100) ) 
         + CAST('</' + node.value('fn:local-name(.)',
            'varchar(100)') + '>' AS varchar(100) ) AS name 
    FROM @xml.nodes('/root/item/*') AS roots(node)

)

SELECT @xmlcolumns = (
SELECT CONVERT(XML,name) FROM (
SELECT DISTINCT name 
FROM Xml_CTE
) a
FOR XML PATH(''), ROOT('root')
)

declare @SQL nvarchar(max) = ''
declare @Col nvarchar(max) = ', T.N.value(''[COLNAME][1]'', ''varchar(100)'') as [COLNAME]'  

--use the unique column list xml object to build the select statement
select @SQL = @SQL + replace(@Col, '[COLNAME]', T.N.value('local-name(.)', 'sysname'))
from @xmlcolumns.nodes('/root/*') as T(N) 

--build the entire query statement, using the original XML object as the data source
set @SQL = 'select '+stuff(@SQL, 1, 2, '')+' from @xml.nodes(''/root/item'') as T(N)' 

exec sp_executesql @SQL, N'@xml xml', @xml;
 java -jar liquibase.jar 
         --classpath=sqlitejdbc-v<version>.jar 
         --driver=org.sqlite.JDBC 
         --url="jdbc:sqlite:exampledb.sqlite" 
         --changeLogFile=db.changelog.initial-state.xml 
         generateChangeLog