Mysql Liquibase(changeLogSync、update、changeLogSyncSQL)不创建表或插入数据
我一直在关注这个页面,以获得Liquibase setup(),其中至少包含我的基本表和数据。我成功地跑了Mysql Liquibase(changeLogSync、update、changeLogSyncSQL)不创建表或插入数据,mysql,liquibase,database-versioning,Mysql,Liquibase,Database Versioning,我一直在关注这个页面,以获得Liquibase setup(),其中至少包含我的基本表和数据。我成功地跑了 ./liquibase --driver=com.mysql.jdbc.Driver \ --classpath=lib/mysql-connector-java-5.1.34-bin.jar \ --changeLogFile="../data/database/boot.json" \ --url="jdbc:mysql://localhost/tester" \ --username
./liquibase --driver=com.mysql.jdbc.Driver \
--classpath=lib/mysql-connector-java-5.1.34-bin.jar \
--changeLogFile="../data/database/boot.json" \
--url="jdbc:mysql://localhost/tester" \
--username=root \
--password=password \
--logLevel=debug \
generateChangeLog
我做了两次,一次用于表结构,一次用于数据
./liquibase --driver=com.mysql.jdbc.Driver \
--classpath=lib/mysql-connector-java-5.1.34-bin.jar \
--changeLogFile="../data/database/base-data.json" \
--url="jdbc:mysql://localhost/tester" \
--username=root \
--password=password \
--logLevel=debug \
--diffTypes="data"
generateChangeLog
它生成boot.json和base-data.json两个文件。这些文件看起来不错,至少与其他网站和liquibase文件相比是这样。我发现的唯一问题是数据文件的日期戳生成了一个关于“:”的错误,但如果我将它们括在引号中,liquibase runs和syas就成功了。虽然当我检查数据库时,我只有两个表
DATABASECHANGELOG
DATABASECHANGELOGLOCK
如果我查看DATABASECHANGELOG,在运行sync命令后,它拥有来自这两个文件的所有提交。但它没有我需要的任何表格,当然也没有数据。我想它可能不会显示作为版本控制的表,所以我尝试了一个常规的select语句
select * from ua_auth_user;
ERROR 1146 (42S02): Table 'tester.ua_auth_user' doesn't exist
任何帮助都很棒。我需要做什么才能让liquibase从一个新的数据库中使用我导出的数据生成我的模式。如果我在获取数据和表结构时出错,我将更改它。在我尝试主要开发之前,我只是按照说明创建并运行了一个工作示例
---更新(根据Nathan Voxland的建议)
我删除了所有的表,除了一个表开始。我删除了数据库,创建了一个全新的数据库。然后我运行下面的命令
boot.json
{ "databaseChangeLog": [
{
"changeSet": {
"id": "1",
"author": "lumberjacked",
"changes": [
{
"createTable": {
"columns": [
{
"column": {
"autoIncrement": true,
"constraints": {
"constraints": {
"primaryKey": true
}
},
"name": "id",
"type": "INT"
}
},
{
"column": {
"name": "subject_category_id",
"type": "INT"
}
},
{
"column": {
"name": "subject",
"type": "VARCHAR(50)"
}
},
{
"column": {
"name": "label",
"type": "VARCHAR(50)"
}
}]
,
"tableName": "common__subjects"
}
}]
}
}
]}
命令
➜ liquibase-bin git:(test) ✗ ./liquibase
--driver=com.mysql.jdbc.Driver
--classpath=lib/mysql-connector-java-5.1.34-bin.jar
--changeLogFile="../data/database/boot.json"
--url="jdbc:mysql://localhost/tester"
--username=root
--password=password
--logLevel=debug update
错误消息
Unexpected error running Liquibase:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Incorrect
table definition; there can be only one auto column and it must be
defined as a key
SEVERE 1/18/15 4:05 PM: liquibase:
../data/database/boot.json::1::lumberjacked:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Incorrect
table definition; there can be only one auto column and it must be
defined as a key
当我出于某种原因导出数据时,liquibase生成了错误的json,但它不是无效的json,只是错误地包装了两次约束。我不知道它是否应该是这样,但是在删除第二个约束之后,它生成了所有的表。在去掉底部的唯一约束和外部约束后,我的表文件大约有4000行。所以我不能完全确定json中没有更多的错误 产生错误
"column": {
"autoIncrement": true,
"constraints": {
"constraints": {
"primaryKey": true
}
}
纠正
"column": {
"autoIncrement": true,
"constraints": {
"primaryKey": true
}
}
"column": {
"autoIncrement": true,
"constraints": {
"primaryKey": true
}
}
您需要检查正在生成的文件。出于某些原因,liquibase错误地生成了json。查看您的文件后,您需要执行以下操作: 原创的
"column": {
"autoIncrement": true,
"constraints": {
"constraints": {
"primaryKey": true
}
}
}
纠正
"column": {
"autoIncrement": true,
"constraints": {
"primaryKey": true
}
}
"column": {
"autoIncrement": true,
"constraints": {
"primaryKey": true
}
}
奇怪的是,即使表不存在,变更集也会被标记为已运行。创建表时出现的任何异常都应阻止databasechangelog插入。当你运行
liquibase update
时,是否有任何错误?我今天将尝试你的建议并收集输出。为了在值得赞扬的地方给予赞扬,我的好友@gmaniac解决了问题,他的建议就是解决方法。我只是迟迟不去想在出发之前把两个和两个放在一起。