2008-09-18 23 views
14

que he probado las herramientas enumeradas here, algunos con más éxito que otros, pero ninguno me dio una sintaxis válida postgres que podría utilizar (errores TINYINT etc.)¿Hay una herramienta simple para convertir mysql en sintaxis postgresql?

+0

posible duplicado de [¿Hay una herramienta oficial para portar una base de datos MySQL a PostgreSQL?] (Http://stackoverflow.com/questions/8371991/is-there-an-official-tool-for-porting -a-mysql-database-to-postgresql) –

Respuesta

10

Hay una opción mysqldump lo que hace el código de PostgreSQL de salida:

 
mysqldump --compatible=postgresql ... 
+9

Parece que no funciona en absoluto ... – mgol

+1

La documentación dice que la salida es solo " más compatible ". http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_compatible – djjeck

+1

Como dice @m_gol, no funciona. Genera un archivo sql, pero no se puede importar a pg. – Oleander

-1

Tenga una mirada en PG Foundry, utilidades extra para Postgres tienden a vivir allí. Sin embargo, creo que la herramienta que estás buscando existe.

+1

Hay algunos proyectos allí, pero no pude encontrar uno que funcione – djjeck

-1

es muy probable que nunca obtenga una herramienta para tal tarea que haría todo su trabajo por usted. prepárese para hacer un trabajo de refactorización usted mismo.

3

Después de un tiempo en Google encontré this post.

  1. Instalar la gema mysql2psql utilizando [sudo] gem install mysql2psql.
  2. Crea un archivo de configuración ejecutando mysql2psql. Verá un error, pero debería haberse creado un archivo mysql2psql.yml.
  3. Editar mysql2psql.yml
  4. Run mysql2psql de nuevo para migrar los datos.

Consejo: Ajuste force_truncate a true en su archivo de configuración mysql2psql.yml si desea que la base de datos PostgreSQL que se solucione antes de migrar los datos.

+0

Lo usé y funcionó bien para mí. "mysqldump --compatible = postgresql" (de la respuesta de vog) tiene demasiados problemas para ser útil. –

1

He usado py-mysql2pgsql. Después de la instalación sólo necesita fichero de configuración sencilla en formato yml (origen, destino), por ejemplo .:

# 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 

Uso:

> 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. 

Más en su página principal https://github.com/philipsoutham/py-mysql2pgsql.

0

This page enumera las diferencias de sintaxis, pero un convertidor de consultas de trabajo simple no he encontrado todavía. Usar un paquete ORM en lugar de SQL sin formato podría evitar estos problemas.

estoy actualmente la piratería hasta un convertidor para una base de código legado:

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 
} 

Para CREATE declaraciones, SQLines convierte la mayor parte de ellos en línea. Sin embargo, tuve que editar el mysqldump después:

"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. 
-1

¡Prueba este, funciona como el encanto!

http://www.sqlines.com/online 
+0

Um. Cero efecto. No cambió nada en la consulta SQL, y la consulta tenía un "left (" en él. Eso debería haberse convertido en una "subcadena (". – TheSatinKnight

Cuestiones relacionadas