【问题标题】:SQL: Application cross-db maintain only one generic schemaSQL:应用程序跨数据库只维护一个通用模式
【发布时间】:2014-05-31 09:50:44
【问题描述】:

我实际上有一个基于 MySQL 的应用程序,其架构基于 InnoDB(有约束...) 我的同事需要导入这个架构,所以我将我的架构导出到 SQL 文件中。

例如:

DROP TABLE IF EXISTS `admins`;
CREATE TABLE `admins` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(45) NOT NULL,
  `password` varchar(45) NOT NULL,
  `email` varchar(45) DEFAULT NULL,
  `creation_date` datetime NOT NULL,
  `close_date` datetime DEFAULT NULL,
  `close_reason` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

现在,我想要一个跨数据库应用程序,所以:

  • 我尝试在 PostgreSQL 中导入我以前的 sql 文件,但没有成功,我的 SQL 文件是 mysql 相关的(例如使用`字符...)
  • 我尝试使用 mysqldump 和兼容模式“--compatible=ansi”导出我的架构,我的目标是:拥有一个与所有主要 SGBD 兼容的通用 sql 文件。但它不起作用:PostgreSQL 返回有关 synthax 的错误

compatible=ansi 返回:

DROP TABLE IF EXISTS "admins";
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE "admins" (
  "id" smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  "username" varchar(45) NOT NULL,
  "password" varchar(45) NOT NULL,
  "email" varchar(45) DEFAULT NULL,
  "creation_date" datetime NOT NULL,
  "close_date" datetime DEFAULT NULL,
  "close_reason" varchar(45) DEFAULT NULL,
  PRIMARY KEY ("id")
);
/*!40101 SET character_set_client = @saved_cs_client */;

我什至尝试使用兼容性=postgresql 导出:

DROP TABLE IF EXISTS "admins";
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE "admins" (
  "id" smallint(5) unsigned NOT NULL,
  "username" varchar(45) NOT NULL,
  "password" varchar(45) NOT NULL,
  "email" varchar(45) DEFAULT NULL,
  "creation_date" datetime NOT NULL,
  "close_date" datetime DEFAULT NULL,
  "close_reason" varchar(45) DEFAULT NULL,
  PRIMARY KEY ("id")
);
/*!40101 SET character_set_client = @saved_cs_client */;

但也没有用...

我知道有工具可以将 MySQL 架构转换为 PostgreSQL 架构,但这不是目标...

我的问题:是否有可能只有一个与 MySQL、PostgreSQL、SQLite 兼容的 SQL 文件......并且不为每个 SGBD 维护一个 SQL 文件?

谢谢

【问题讨论】:

    标签: mysql sql sql-server database postgresql


    【解决方案1】:

    我的问题:是否可以只有一个与 MySQL、PostgreSQL、SQLite... 兼容的 SQL 文件,并且不为每个 SGBD 维护一个 SQL 文件?

    使用原始 SQL 并不容易,除非您希望使用数据库支持的功能的可悲子集。

    SQL 中的 SELECT 和 DML 可以适度移植,但 DDL 通常是除了全部基础之外的所有内容的无望噩梦。您将需要一个为您生成 SQL 的抽象工具,处理数据库在序列/生成的键、类型命名、约束、索引创建等方面的特定差异。

    作为一个例子,让我们看一下自动递增值/序列,它们经常用于合成键:

    • MySQL:integer AUTO_INCREMENT
    • PostgreSQL:SERIAL(序列的简写)
    • MS-SQL:int IDENTITY(1,1)
    • Oracle(低于 12c):没有直接支持,使用序列。
    • Oracle(12c 及以上):NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY

    .. 这只是用于生成密钥的非常常见的任务。存在许多其他有趣的差异。例如,MySQL 有tinyintunsigned int。 PostgreSQL 没有。 PostgreSQL 有boolbit(n) 位域、范围类型、PostGIS 类型等,而其他大多数数据库都没有。即使对于共享的东西,怪癖也比比皆是——在所有 DB 中指定“4 字节有符号整数”甚至都不是微不足道的。

    Liquibase 可以提供帮助,我听说过很好的消息。有些人转而使用 ORM 来管理他们的 DDL 生成 - 尽管这些人倾向于再次使用最原始的数据库功能。

    【讨论】:

    • 好的,谢谢!所以我需要一个更高级别的工具来描述我的模式并将其导出到不同的数据库。我去看看Liquibase,一些ORM,你知道其他工具吗?
    猜你喜欢
    • 2010-12-10
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多