2010/11/05

Transmogrifier - Import/Export Made Easy

collective.transmogrifier 是處理資料轉換或匯出匯入的工具,常被用來支援 Plone 網站資料的匯出匯入,但其他網站同樣可以引用。

成功測試的是使用 Plone 3.3.5 UnfiedInstaller 來安裝,修改 buildout.cfg 內容如下:
eggs =
Pillow
Plone
collective.transmogrifier
plone.app.transmogrifier
transmogrify.sqlalchemy
pysqlite
argparse
iw.debug

zcml =
collective.transmogrifier-meta
collective.transmogrifier
plone.app.transmogrifier
transmogrify.sqlalchemy
iw.debug

[versions]
Pillow = 1.2
SQLAlchemy = 0.6.5
argparse = 1.1
distribute = 0.6.14
iw.debug = 0.3
plone.app.transmogrifier = 1.1
pysqlite = 2.6.0
transmogrify.sqlalchemy = 1.0.1
collective.transmogrifier = 1.2
ipdb = 0.2
ipython = 0.10.1

使用時要搭配設定檔,例如建立一個 import_test.cfg 檔案,來處理資料庫內容的匯入。設定檔的格式跟 buildout.cfg 類似,第一個設定區段 [transmogrifier] 先指定要用到的 pipeline 項目,也就是轉換資料的過程,需要哪些分解動作。以匯入的例子來說,資料來源是資料庫的內容,存取的資料會依序在 pipeline 傳遞,最後寫進 ZODB 並且更新 Archetype 之類的表單內容。
[transmogrifier]
pipeline =
source
add_type
add_path
constructor
schemaupdater

每個 pipeline 項目又有對應的 section 設定值,其中的 blueprint 是 named adapter,而且慣例是以 package name 來命名,完全避免撞名的問題。以 [source] 的設定值為例,它是搭配 SQLite 來讀取資料,傳遞中的資料以 dict 格式來處理,以 [add_type] 為例,它會新增一組 '_type': 'MyContentType' 資料併入 dict 裡,再往下一個 pipeline 傳遞。
[source]
blueprint = transmogrify.sqlalchemy
dsn = sqlite:///database.sqlite
query = SELECT gid, name as title, organizer, address, tel FROM test

[add_type]
blueprint = collective.transmogrifier.sections.inserter
key = string:_type
value = string:MyContentType

[add_path]
blueprint = collective.transmogrifier.sections.inserter
key = string:_path
value = python:'/MyFolder/'+str(item['gid'])

[constructor]
blueprint = collective.transmogrifier.sections.constructor
required = True

[schemaupdater]
blueprint = plone.app.transmogrifier.atschemaupdater

資料來源並不限於資料庫,也可以是 CSV 檔案,除了匯出匯入資料外,也可以轉換文字編碼之類的動作。如果想套用 PostgreSQL 來源,安裝的模組檔案改為 psycopg2,並參考 transmogrify.sqlalchemy 的範例,改成 dsn = postgres://scott:tiger@localhost:5432/mydatabase 的設定值。

1 comment:

marr said...

http://stackoverflow.com/questions/8083295/how-to-convert-a-string-into-a-datetime-in-a-trasmogrifier-step