Я переношу БД Informix (11.7) на PostgreSQL (9.2). Есть только одна проблема: как переместить blob(image) из Informix в PostgreSQL(9.2)? Спасибо заранее.
Данные миграции BLOB-объектов из Informix в Postgres
Ответы (2)
Я сделал несколько таких преобразований между различными базами данных, используя Jython и JDBC.
Все, что вам нужно, это драйверы Informix и PostgreSQL JDBC в CLASSPATH
.
У меня есть таблица Informix со столбцом BYTE
и таблица PostgreSQL со столбцом BYTEA
:
-- Informix
CREATE TABLE _blob_test (
id integer PRIMARY KEY,
image BYTE
)
-- PostgreSQL
CREATE TABLE _blob_test (
id integer PRIMARY KEY,
image BYTEA
)
Затем вы можете использовать методы JDBC getObject()/setObject()
для копирования данных:
#!/usr/bin/env jython
# -*- coding: utf8 -*-
from java.sql import DriverManager
from java.lang import Class
Class.forName("com.informix.jdbc.IfxDriver")
Class.forName('org.postgresql.Driver')
def copy_table(db_from, db_to):
col_count = 2
insert_stmt = db_to.prepareStatement('INSERT INTO _blob_test (id, image) VALUES (?, ?)')
pstm2 = db_from.createStatement()
pstm2.setFetchSize(10000)
rs_in = pstm2.executeQuery('SELECT * FROM _blob_test')
try:
batch_buffer = 0
batch_size = 100
while (rs_in.next()):
for i in range(1, col_count + 1):
insert_stmt.setObject(i, rs_in.getObject(i))
insert_stmt.addBatch()
batch_buffer += 1
if (batch_buffer % batch_size == 0):
insert_stmt.executeBatch()
batch_buffer = 0
if (batch_buffer > 0):
insert_stmt.executeBatch()
finally:
rs_in.close()
pstm2.close()
db_from = DriverManager.getConnection('jdbc:informix-sqli://informix-test:9088/infdb:informixserver=ol_testifx;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250', 'informix', '12345')
db_to = DriverManager.getConnection('jdbc:postgresql://pg-test:5490/pg_test?stringtype=unspecified', 'postgres', '12345')
copy_table(db_from, db_to)
Я знаю, что ответ запоздал, но это может помочь другим людям, ищущим решение.
Мы выполнили аналогичную миграцию в нашей компании.
Для переноса двоичных файлов мы использовали инструмент под названием SQL-workbench, мы использовали помпа данных (инструменты меню). Пампер данных позволяет копировать данные из исходной БД в целевую БД. СУБД могут быть разными (в данном случае Informix и Postgres).
Вам необходимо зарегистрировать оба драйвера в «Файл > Управление драйверами» и создать 2 профиля: исходный профиль, ориентированный на вашу базу данных Informix, и целевой профиль, ориентированный на вашу Postgres. ДБ. Затем профили будут выбраны из Data pumper. Если у вас есть несколько таблиц для копирования одновременно, прочтите документацию по использованию функции Wbcopy (очень полезно)