gpt4 book ai didi

oracle - 使用目标数据库的数据类型生成 XML/SQL 输出

转载 作者:行者123 更新时间:2023-11-29 13:58:49 25 4
gpt4 key购买 nike

我需要将 PostgreSQL 数据库的结构转换为 Oracle。在 PostgreSQL 中,我有一个包含数据的 postgres 数据库。

在 Oracle 中,我有一个空白数据库,我想在其中编写 PostgreSQL 中的 postgres 数据库。

其实我不需要数据,只需要结构(关系)。

为此我使用 Liquibase .我使用以下命令从 PostgreSQL 获取变更日志:

liquibase \
--driver=org.postgresql.Driver \
--classpath="C:\db_drivers\postgresql-9.3-1102.jdbc3.jar" \
--changeLogFile="./postgresql_changelog.xml" \
--url="jdbc:postgresql://localhost:5432/postgres" \
--username=schema_name_here \
--password=************** \
--logLevel=debug \
--defaultSchemaName=sep \
generateChangeLog

在此之后,我尝试在 Oracle 数据库中创建对象:

liquibase \
--driver=oracle.jdbc.OracleDriver \
--classpath="C:\db_drivers\ojdbc14.jar" \
--changeLogFile="./postgresql_changelog.xml" \
--url="jdbc:oracle:thin:@ip_here:orabeta" \
--username=*** \
--password=*** \
update

不起作用:ORA-00902

这是 postgresql_changelog.xml 的片段:

...
<changeSet author="Alexey (generated)" id="1409146335011-53">
<createTable tableName="TABLE1A">
<column name="total_pk" type="INT8">
<constraints nullable="false"/>
</column>
<column name="form_fk" type="INT8">
<constraints nullable="false"/>
</column>
...

我还生成了一个纯 SQL- 文件:

liquibase \
--driver=oracle.jdbc.OracleDriver \
--classpath="C:\db_drivers\ojdbc14.jar" \
--changeLogFile="./postgresql_changelog.xml" \
--url="jdbc:oracle:thin:@ip_here:orabeta" \
--username=*** \
--password=*** \
updateSQL > update.sql

这是 update.sql 的一个片段:

...
CREATE TABLE SCHEMA_HERE.TABLE1A (total_pk INT8 NOT NULL, form_fk INT8, .....etc );
INSERT INTO SCHEMA_HERE.TABLE1A (ID, FORM_ID, ...etc)
...

我想生成一个文件,其中所有数据类型都对应于目标数据库,即我要创建的数据库。我可以编写一个简单的解析器来替换数据类型,但这不是正确的解决方案 - 可以是多个数据库。

是否可以使用目标数据库的数据类型生成 XML/SQL 输出?

或者也许有一个选项允许生成带有“抽象”数据类型的输出?即使用不在真实数据库中的数据类型,例如,而不是 INT8 - 抽象整数数据类型等。

最佳答案

实际上,有必要手动更正生成文件中的数据类型(不仅是数据类型,还有数据库的所有细节(减少约束名称、索引的长度等)。数据类型不会自动转换。

例如:

...
<changeSet author="Alexey (generated)" id="1409146335011-53">
<createTable tableName="TABLE1A">
<!-- replace INT8 to NUMBER(16) for Oracle (for example) -->
<column name="total_pk" type="INT8">
<constraints nullable="false"/>
</column>
<!-- replace INT4 to NUMBER(10) for Oracle (for example) -->
<column name="form_fk" type="INT4">
<constraints nullable="false"/>
</column>
...

之后执行命令:

liquibase \
--driver=oracle.jdbc.OracleDriver \
--classpath="C:\db_drivers\ojdbc14.jar" \
--changeLogFile="./postgresql_changelog.xml" \
--url="jdbc:oracle:thin:@ip_here:orabeta" \
--username=*** \
--password=*** \
update

结构将在目标数据库上生成。

但是,实际上,可以使用“抽象”数据类型,如文档中所写:Liquibase, Column tag

To help make scripts database-independent, the following “generic” data types will be converted to the correct database implementation: BOOLEAN CURRENCY UUID CLOB BLOB DATE DATETIME TIME BIGINT

Also, specifying a java.sql.Types.* type will be converted to the correct type as well. If needed, precision can be included. Here are some examples: java.sql.Types.TIMESTAMP java.sql.Types.VARCHAR(255)

并且可以在没有 DDL 的情况下复制结构(以及没有 DML 的数据)。

同样可以迁移数据(选项 --diffTypes = "data"):

liquibase \
--driver=org.postgresql.Driver \
--classpath="C:\db_drivers\postgresql-9.3-1102.jdbc3.jar" \
--changeLogFile="./data.xml" \
--url="jdbc:postgresql://localhost:5432/postgres" \
--username=*** \
--password=*** \
--logLevel=debug \
--defaultSchemaName=schema_name_here \
--diffTypes="data" \
generateChangeLog

并且在临时禁用所有约束(手动)之后:

liquibase \
--driver=oracle.jdbc.OracleDriver \
--classpath="C:\db_drivers\ojdbc14.jar" \
--changeLogFile="./data.xml" \
--url="jdbc:oracle:thin:@ip_here:orabeta" \
--username=*** \
--password=*** \
--logLevel=debug \
update

关于oracle - 使用目标数据库的数据类型生成 XML/SQL 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25530887/

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