gpt4 book ai didi

java - 为不同数据库生成脚本的最佳选择

转载 作者:行者123 更新时间:2023-11-30 04:05:54 26 4
gpt4 key购买 nike

我想知道如何从特定模板生成脚本(DDL、DML)到不同的数据库,如 Oracle、MSSQL、Sybase。

Liquibase 似乎适合,但是有没有任何框架或方法可以做到这一点?

最佳答案

以下示例为 H2 数据库生成 SQL。 XML 变更集使 liquibase 能够生成数据库特定的 SQL。

示例

安装 jar

mkdir lib
curl http://search.maven.org/remotecontent?filepath=org/liquibase/liquibase-core/3.0.8/liquibase-core-3.0.8.jar -o lib/liquibase.jar
curl http://search.maven.org/remotecontent?filepath=com/h2database/h2/1.3.174/h2-1.3.174.jar -o lib/h2.jar

这是一个骗局。您还可以下载并安装 zip 包。

示例变更日志文件

此变更日志创建一个表。以下格式为 XML,其他支持的格式为 YAML 和 SQL。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

<changeSet author="mark" id="1">
<createTable tableName="EMPLOYEE">
<column name="EMPNO" type="INT">
<constraints nullable="false" primaryKey="true" primaryKeyName="EMP_PK"/>
</column>
<column name="NAME" type="VARCHAR(10)"/>
<column name="JOB" type="VARCHAR(9)"/>
<column name="BOSS" type="INT"/>
<column name="HIREDATE" type="VARCHAR(12)"/>
<column name="SALARY" type="DECIMAL(7,2)"/>
<column name="COMM" type="DECIMAL(7,2)"/>
<column name="DEPTNO" type="INT"/>
</createTable>
</changeSet>

</databaseChangeLog>

正在运行

Liquibase 可以按如下方式运行来生成 SQL

java -jar ./lib/liquibase.jar \
--classpath=lib/h2.jar \
--url=jdbc:h2:db/scottTiger \
--driver=org.h2.Driver \
--username=user \
--password=pass \
--changeLogFile=sample.xml \
updateSQL

“更新”命令将对数据库应用 SQL。

生成的输出

-- *********************************************************************
-- Update Database Script
-- *********************************************************************
-- Change Log: sample.xml
-- Ran at: 22/12/13 22:30
-- Against: USER@jdbc:h2:db/scottTiger
-- Liquibase version: 3.0.8
-- *********************************************************************

-- Create Database Lock Table
CREATE TABLE PUBLIC.DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID));

-- Initialize Database Lock Table
DELETE FROM PUBLIC.DATABASECHANGELOGLOCK;

INSERT INTO PUBLIC.DATABASECHANGELOGLOCK (ID, LOCKED) VALUES (1, FALSE);

-- Lock Database
-- Create Database Change Log Table
CREATE TABLE PUBLIC.DATABASECHANGELOG (ID VARCHAR(255) NOT NULL, AUTHOR VARCHAR(255) NOT NULL, FILENAME VARCHAR(255) NOT NULL, DATEEXECUTED TIMESTAMP NOT NULL, ORDEREXECUTED INT NOT NULL, EXECTYPE VARCHAR(10) NOT NULL, MD5SUM VARCHAR(35), DESCRIPTION VARCHAR(255), COMMENTS VARCHAR(255), TAG VARCHAR(255), LIQUIBASE VARCHAR(20));

-- Changeset sample.xml::1::mark
CREATE TABLE PUBLIC.EMPLOYEE (EMPNO INT NOT NULL, NAME VARCHAR(10), JOB VARCHAR(9), BOSS INT, HIREDATE VARCHAR(12), SALARY DECIMAL(7, 2), COMM DECIMAL(7, 2), DEPTNO INT, CONSTRAINT EMP_PK PRIMARY KEY (EMPNO));

INSERT INTO PUBLIC.DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, LIQUIBASE) VALUES ('1', 'mark', 'sample.xml', NOW(), 1, '7:4700326f252366e9cfe598fded5037c8', 'createTable', '', 'EXECUTED', '3.0.8');

Liquibase 创建一个名为“DATABASECHANGELOG”的特殊表来跟踪所有更改。仔细看,你会发现“EMPLOYEE”表的建表语句。

此示例适用于 H2。支持其他数据库。

关于java - 为不同数据库生成脚本的最佳选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20733777/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com