我正在将 Informix (11.7) DB 迁移到 PostgreSQL(9.2)。只有一个问题:如何将 blob(image) 从 Informix 移动到 PostgreSQL(9.2)?提前谢谢了。
问问题
1522 次
2 回答
1
我使用 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
)
然后可以使用 JDBCgetObject()/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)
于 2012-10-23T08:40:21.507 回答
0
我知道答案很晚,但这可以帮助其他人寻找解决方案。
我们公司也做过类似的迁移。
为了迁移二进制文件,我们使用了一个名为 SQL-workbench 的工具,我们使用了数据泵(菜单工具)。数据泵允许将数据从源数据库复制到目标数据库。DBMS 可能不同(在本例中为 Informix 和 Postgres)。
您必须在“文件 > 管理驱动程序”中注册两个驱动程序并创建 2 个配置文件:一个针对您的 Informix DB 的源配置文件和一个针对您的 Postgres DB 的目标配置文件。然后将从 Data pumper 中选择配置文件。
如果您有多个表要一次复制,请阅读有关使用函数 Wbcopy 的文档(非常有用)
于 2017-11-24T14:13:03.400 回答