最近由於工作需要,要將之前使用的postgresql資料庫換成sqlite資料庫,上網蒐集了些資料,下面就整理一下我的處理方法。
思路:使用pg_dump將資料庫轉存成sql命令文字,然後在sqlite裡執行sql命令建立資料庫,並匯入資料
具體操作步驟
我們主要可以通過以下三步完成資料庫的轉換。
1.生成轉儲指令碼檔案
我們可以通過pg_dump生成資料庫的轉儲模式(表結構)和轉儲資料,然後編輯該檔案,在匯入sqlite。但是我沒有選擇這樣做,因為將轉儲模式和轉儲資料生成到乙個檔案中,然後編輯檔案不是很方便,所以我選擇分別將轉儲模式和轉儲資料生成到兩個檔案中,先建立資料表,再匯入資料,分兩步走。
1.1 生成轉儲模式檔案schema.sql
c:\program files\postgresql\9.2\bin>pg_dump -h 192.168.9.210 -u postgres -s your_db_name > e:\schema.sql
1.2 生成轉儲資料檔案data.sql
c:\program files\postgresql\9.2\bin>pg_dump -h 192.168.9.210 -u postgres --data-only --inserts your_db_name > e:\data.sql
為什麼需要這步呢,因為生成的指令碼檔案有很多是sqlite不支援的,需要將他們轉化成sqlite支援的語句。
2.1 刪除『set』開頭的句子(schema.sql,data.sql)
你會在檔案的開頭看到類似set statement_timeout = 0;
的句子,刪除這些句子就可以了,因為sqlite不需要這些東西。
2.2 sqlite不支援通過alter新增主鍵,只能在建表時新增(schema.sql)
將所有類似於:
alter table only table_name add constraint table_name_pkey primary key (id);
刪掉並在表的主鍵字段新增primary key。
2.3 sqlite不支援comment注釋(schema.sql)
刪掉所有以comment開頭的語句
2.4 sqlite不支援owner許可權設定(schema.sql)
刪掉以下所有類似的句子
alter table public.table_name owner to postgres
2.5 sqlite不知道支不支援載入外部模組,報錯於是刪掉了(schema.sql)刪掉以下類似語句
create extension if not exists plpgsql with schema pg_catalog
2.6 修改自增字段(schema.sql)將以下postgresql自增語句
create table table_name (
id integer not null,
);create sequence table_name_id_seq
start with 1
increment by 1
no minvalue
no maxvalue
cache 1;
alter sequence table_name_id_seq owned by table_name.id;
alter table only table_name alter column id set default nextval('table_name_id_seq'::regclass);
改為
create table table_name (
id integer primary key autoincrement,
);
2.7 刪除重置序列物件的計數器數值操作語句(data.sql)
你會看到一些類似於select pg_catalog.setval('my_object_id_seq', 10, true);
的句子,它在postgresql裡的作用是重置序列物件的計數器數值,就是為了保證自增id值的正確性,具體可以檢視postgresql序列操作函式。這些也直接刪掉就可以了,sqlite裡不會用到這些值,並且這些會在sqlite裡報錯的。
2.8 替換 true =>』t『 、false => 』f『(data.sql)
如果在生成的insert into語句中有true和false的值,我們需要將它們分別替換成』t『和』f『。例如:
替換成insert into table_name values (1, true, false);
2.9 讓匯入資料更快(data.sql)insert into table_name values (1, 't', 'f');
第一次匯入2mb的資料花了大約整整12分鐘,之後google之,發現sqlite預設情況下是將一條語句新增到乙個事務中,這貌似看起來很浪費時間(修改之後,匯入資料只花了12秒)。
在檔案的開始新增begin;在檔案的結尾新增end;就可以將所有的insert into新增到乙個事務中去處理了。例如:
3. 建立資料庫並匯入資料begin;
-- a lot of insert into statments
end;
3.1 建立資料庫
# sqlite3 databasename.db
sqlite> .read pschema.sql
3.2 匯入資料
sqlite> .read data.sql
好了,大功告成,完成了從postgresql到sqlite的轉換。 移植postgresql資料庫方法
建立資料庫可以通過命令createdb db name 或者是 create database db name命令建立,除此之外,也可以通過資料庫原始檔移植的方法進行建立。我們知道postgresql資料庫的原始檔是放在postgresql目錄下的,postgresql目錄下的base目錄的下一層就...
postgresql模板資料庫
template0和template1為postgresql資料庫的模板資料庫,新建的資料庫預設使用template1作為模板。template0和template1的區別在於template0無法修改,因此你可以修改template1資料庫以定製新建立的資料庫。template資料庫無法被刪除 d...
postgresql資料庫安裝
安裝並初始化 1 解壓資料庫並放到指定目錄 在opt目錄下 tar xvzf postgresql 10.1 1 linux x64 binaries.tar.gz 解壓出來之後目錄為pgsql 2 mv pgsql usr local pgsql 3 建立pgsql使用者並設定密碼 useradd...