是否有一个简单的工具可以将 mysql 转换为 postgresql 语法?

Posted

技术标签:

【中文标题】是否有一个简单的工具可以将 mysql 转换为 postgresql 语法?【英文标题】:Is there a simple tool to convert mysql to postgresql syntax? 【发布时间】:2010-09-10 15:50:27 【问题描述】:

我已经尝试了here 列出的工具,其中一些比其他工具更成功,但没有一个能提供我可以使用的有效 postgres 语法(小错误等)

【问题讨论】:

Is there an official tool for porting a mysql database to PostgreSQL?的可能重复 【参考方案1】:

有一个 mysqldump 选项可以输出 PostgreSQL 代码:

mysqldump --compatible=postgresql ...

但这不太好用。

相反,请将mysql-to-postgres 工具视为described in Linus Oleander's answer。

【讨论】:

文档说输出只是“更兼容”。 dev.mysql.com/doc/refman/5.1/en/… 就像@m_gol 所说,它不起作用。生成一个sql文件,但是无法导入pg。 @djjeck 不仅“更兼容”,而且与 postgres 无关...根据您指向的文档:“唯一允许的值选项是 ansi"。所以上面的文字应该是mysqldump --compatible=ansil【参考方案2】:

试试这个,效果很赞!!

http://www.sqlines.com/online

【讨论】:

嗯。零效应。它根本没有改变sql查询中的任何内容,并且查询中有一个“left(”。应该已经转换为“substring(”。【参考方案3】:

在 Google 上搜索了一段时间后,我找到了this post。

    使用[sudo] gem install mysql2psql 安装mysql2psql gem。 通过运行mysql2psql 创建配置文件。您会看到一个错误,但应该已经创建了一个 mysql2psql.yml 文件。 编辑mysql2psql.yml 再次运行 mysql2psql 以迁移您的数据。

提示:如果您希望在迁移数据之前清除 postgresql 数据库,请在 mysql2psql.yml 配置文件中将 force_truncate 设置为 true

【讨论】:

我用过这个,对我来说效果很好。 “mysqldump --compatible=postgresql”(来自 vog 的回答)有太多有用的问题。【参考方案4】:

在 Debian(或 Ubuntu)上安装 pgloader:

sudo apt install pgloader

以 postgres 用户登录并创建数据库

sudo su postgres
createdb -O user db_migrated

将数据从mysql数据库传输到postgresql

pgloader mysql://user@localhost/db postgresql:///db_migrated

还要检查Dimitri Fontaine's rewrite of pgloader from python to common lisp,以便他可以实现真正的线程。

在其他平台上安装

To install pgloader on Windows,您可以使用适用于 Linux 的 Windows 子系统。

To install pgloader on Mac,您可以使用:brew install --HEAD pgloader

【讨论】:

【参考方案5】:

我用过py-mysql2pgsql。安装后只需要 yml 格式的简单配置文件(源、目标),例如:

# if a socket is specified we will use that
# if tcp is chosen you can use compression
mysql:
 hostname: localhost
 port: 3306
 socket: /tmp/mysql.sock
 username: mysql2psql
 password:
 database: mysql2psql_test
 compress: false
destination:
 # if file is given, output goes to file, else postgres
 file:
 postgres:
  hostname: localhost
  port: 5432
  username: mysql2psql
  password:
  database: mysql2psql_test

用法:

> py-mysql2pgsql -h
usage: py-mysql2pgsql [-h] [-v] [-f FILE]

Tool for migrating/converting data from mysql to postgresql.

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose         Show progress of data migration.
  -f FILE, --file FILE  Location of configuration file (default:
                        mysql2pgsql.yml). If none exists at that path,
                        one will be created for you.

更多内容见其主页https://github.com/philipsoutham/py-mysql2pgsql。

【讨论】:

【参考方案6】:

看看PG Foundry,Postgres 的额外实用程序往往会在那里。我相信您正在寻找的工具确实存在。

【讨论】:

那里有一些项目,但我找不到一个可行的【参考方案7】:

这个 postgresql 页面上列出了一款付费软件: http://www.postgresql.org/download/products/1

这是在 pgFoundry 上: http://pgfoundry.org/projects/mysql2pgsql/

【讨论】:

【参考方案8】:

This page 列出了语法差异,但我还没有找到一个简单的工作查询转换器。使用 ORM 包而不是原始 SQL 可以防止这些问题。

我目前正在为旧代码库开发一个转换器:

function mysql2pgsql($mysql)
    return preg_replace("/limit (\d+), *(\d+)/i", "limit $1 offset $2", preg_replace("/as '([^']+)'/i", 'as "$1"', $mysql)); // Note: limit needs order

对于CREATE 语句,SQLines 会在线转换大部分语句。不过,之后我仍然需要编辑 mysqldump:

"mediumtext" -> "text", "^LOCK.*" -> "", "^UNLOCK.*" -> "", "`" -> '"', "'" -> "''" in 'data', "0000-00-00" -> "2000-01-01", deduplicate constraint names, " CHARACTER SET utf8 " -> " ".
"int(10)" -> "int" was missed in the last table, so pass that part of the mysqldump through http://www.sqlines.com/online again.

【讨论】:

【参考方案9】:

您很可能永远不会获得可以为您完成所有工作的此类任务的工具。准备好自己做一些重构工作。

【讨论】:

需要重构也是我使用其他转换工具的经验,因为很多不兼容的SQL dialects。然而,pgloader(在下面的另一个答案中提到)对于数百万行的数据库工作得非常好。

以上是关于是否有一个简单的工具可以将 mysql 转换为 postgresql 语法?的主要内容,如果未能解决你的问题,请参考以下文章

是否有将字符串转换为小写的 MySQL 命令?

将 MySql 转换为 PostgreSQL

将 MS Access 97 转换为 MySQL 5.5(有任何工具吗?)

有没有工具可以自动将简单的 .xib 转换为 Objective-C 代码?

将 SQL Server 数据库转换为 MySQL

是否有任何工具可以将 c/c++ 源代码转换为 html?