PostgreSQL資料庫移植到SQLite資料庫

2021-06-22 14:51:19 字數 3427 閱讀 8391

最近由於工作需要,要將之前使用的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.sqldata.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);
替換成

insert into table_name values (1, 't', 'f');
2.9 讓匯入資料更快(data.sql)

第一次匯入2mb的資料花了大約整整12分鐘,之後google之,發現sqlite預設情況下是將一條語句新增到乙個事務中,這貌似看起來很浪費時間(修改之後,匯入資料只花了12秒)。

在檔案的開始新增begin;在檔案的結尾新增end;就可以將所有的insert into新增到乙個事務中去處理了。例如:

begin;

-- a lot of insert into statments

end;

3. 建立資料庫並匯入資料

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...