上週計劃把 TSA 的 forum 從 Martin 的機器上搬到學校的機器裡。
原本的 forum 是用PunBB + MySQL 架的,但學校的機器只支援 SQLite,也因此試著把 MySQL 轉成 SQLite。
看似很簡單的工作,過程中卻遇到很多麻煩。記下經驗供以後參考。
1. PunBB 所支援的 SQLite 是 version 2, 但現在主流的 SQLite 是 version 3,為了找一個能夠執行 SQLite 2 的 command 的 tool 竟然花了老半天還找不著,包括 SQLite 的官網都沒提供這種軟體了。:-(
後來找到一個支援 SQLite 2 的 rpm 檔,裝到 Linux 上才能產生 PunBB 讀得到的資料庫。
2. TSA forum 的 MySQL charset 是 utf-8,但 SQLite 2 預設支援的 charset 是 ISO-8859-15,似乎沒有辦法轉成 utf-8 (不確定)。官網上說 SQlite 3 預設的 charset 已換成 utf-8,但這對我沒幫助,為了搭配 PunBB 我只能使用 SQLite 2。
3. SQLite 和 MySQL 的 SQL 語法不全相同。最討厭的一點是 SQLite 2竟然不能一個指令 insert multiple record,像是 INSERT INTO a_table VALUES (1,'aa','bb'),(2,'xx','yy') 這種寫法 SQLite 2完全不認得,找過官網後確定 SQLite 不支援 multiple record insertion。一定得把 SQL command 一筆一筆 INSERT,如:INSERT INTO a_table VALUES (1,'aa','bb'); INSERT INTO a_table VALUES (2,'xx','yy'); TSA forum 有上200+用戶,1500+的文章,不可能手動把 MySQL dump 的 multiple insertion 一一改成單筆的 INSERTION command,只得藉助 Python 把 SQL 的 multiple insertion command 重新排列組合。
最後,還是沒能順利的把 MySQL 轉成 SQLite 2,主要是轉過去後太多字變成亂碼,完全無法閱讀。只好上網註冊一個免費空間暫時 host TSA 的 forum。
附上 Python 的 multiple record insertion 重組程式供未來參考。
(參考 http://www.mail-archive.com/sqlite-users@sqlite.org/msg45327.html 改寫)
import re
value_literal = r"""
(?:
' (?: [^'] | '' ) * ' # text literal
|
[^,)\s] + # any other literal
)
"""
value_list_re = r"\(\s*LIT\s*(?:,\s*LIT\s*)*\)".replace("LIT",value_literal)
p = re.compile('INSERT INTO \w+ VALUES')
fwrite = open('./sqlite.insertsql', 'w')
fread = open('./mysql.insertsql', 'r')
for line in fread:
m = p.search(line)
str = line[m.end() : len(line)]
rx = re.compile(value_list_re, re.VERBOSE)
for vlist in rx.findall(str):
fwrite.write(m.group() + " " + vlist + ";\n")
fread.close()
fwrite.close()
0 意見:
張貼意見