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