如何将数据从 CSV 转储复制到具有不同结构的 PSQL 数据库中?
How do I copy data from a CSV dump into a PSQL database with a different structure?
我目前正在尝试将 SQLite3 数据库复制到具有不同结构的 PostgreSQL 数据库中。我该怎么做?
到目前为止我做了什么:
- 我转储了 SQLite 数据库并使用 headers 为所有 table 创建了 CSV 文件。
- 然后我创建了一个新的 PSQL 数据库,其结构符合我的需要table。
- 我还使用旧的 SQLite table 结构创建了一个 PSQL 数据库,并从提到的 CSV 文件中导入了数据,因此我可以访问两个数据库,一个具有旧模式,一个具有新模式,只是以备不时之需。
问题:
如果 table 和列名称与原始名称不同,我不知道如何 import/copy 数据。
例如。 SQLite 数据库和 CSV 对 table“关键字”具有以下结构:
ID, CreatedBy, CreatedByUserId, CreatedOn, ModifiedBy, ModifiedByUserId, ModifiedOn, Name, Notes, Protected, ReservedData
新的 PSQL 数据库对于不同命名的table“关键字”具有以下结构:
KeywordsID, CreatedOn, Keyword, ModifiedOn, Notes
很简单
COPY keywords(
keywordsid, createdon, keyword, notes)
FROM '/home/user/Desktop/bib_csv/keywords.csv' DELIMITER ',' CSV;
不会工作。
背景:
原始数据库是由名为 Citavi 的书目程序创建的。它最初是一个 Microsoft Access 数据库,后来被程序本身移植到 SQLite3,显然数据库现在包含一些错误,阻止大多数程序协助导出到 PSQL,这意味着我必须手动完成。
我想在线访问数据库,但出于多种原因,我希望它 运行 在 PostgreSQL 而不是 SQLite 上。
您不能使用 copy
有选择地导入列。如果您不想使用其他工具,最简单的方法是创建一个具有原始结构的暂存 table,然后 COPY
到 table 中,然后复制只有一些列使用 insert
语句:
create table keywords_old
(
ID ...,
CreatedBy ...,
CreatedByUserId ...,
CreatedOn, ...
);
COPY keywords_old
FROM '/home/user/Desktop/bib_csv/keywords.csv' DELIMITER ',' CSV;
insert into keywords (keywordsid, createdon, keyword, notes)
select id, createdon, name, notes
from keywords_old;
另一种选择是仅从旧数据库中导出选定的列:
COPY keywords (id, createdon, name, notes)
TO '/home/user/Desktop/bib_csv/keywords.csv' DELIMITER ',' CSV;
然后您可以将该文件导入新数据库。
如果将旧数据导入 相同 数据库 但导入不同的模式 (例如 old_data
) 而不是 public
你可以只使用简单的 insert
语句复制数据:
insert into public.keywords (keywordsid, createdon, keyword, notes)
select id, createdon, name, notes
from old_data.keywords;
我目前正在尝试将 SQLite3 数据库复制到具有不同结构的 PostgreSQL 数据库中。我该怎么做?
到目前为止我做了什么:
- 我转储了 SQLite 数据库并使用 headers 为所有 table 创建了 CSV 文件。
- 然后我创建了一个新的 PSQL 数据库,其结构符合我的需要table。
- 我还使用旧的 SQLite table 结构创建了一个 PSQL 数据库,并从提到的 CSV 文件中导入了数据,因此我可以访问两个数据库,一个具有旧模式,一个具有新模式,只是以备不时之需。
问题:
如果 table 和列名称与原始名称不同,我不知道如何 import/copy 数据。 例如。 SQLite 数据库和 CSV 对 table“关键字”具有以下结构:
ID, CreatedBy, CreatedByUserId, CreatedOn, ModifiedBy, ModifiedByUserId, ModifiedOn, Name, Notes, Protected, ReservedData
新的 PSQL 数据库对于不同命名的table“关键字”具有以下结构:
KeywordsID, CreatedOn, Keyword, ModifiedOn, Notes
很简单
COPY keywords(
keywordsid, createdon, keyword, notes)
FROM '/home/user/Desktop/bib_csv/keywords.csv' DELIMITER ',' CSV;
不会工作。
背景:
原始数据库是由名为 Citavi 的书目程序创建的。它最初是一个 Microsoft Access 数据库,后来被程序本身移植到 SQLite3,显然数据库现在包含一些错误,阻止大多数程序协助导出到 PSQL,这意味着我必须手动完成。
我想在线访问数据库,但出于多种原因,我希望它 运行 在 PostgreSQL 而不是 SQLite 上。
您不能使用 copy
有选择地导入列。如果您不想使用其他工具,最简单的方法是创建一个具有原始结构的暂存 table,然后 COPY
到 table 中,然后复制只有一些列使用 insert
语句:
create table keywords_old
(
ID ...,
CreatedBy ...,
CreatedByUserId ...,
CreatedOn, ...
);
COPY keywords_old
FROM '/home/user/Desktop/bib_csv/keywords.csv' DELIMITER ',' CSV;
insert into keywords (keywordsid, createdon, keyword, notes)
select id, createdon, name, notes
from keywords_old;
另一种选择是仅从旧数据库中导出选定的列:
COPY keywords (id, createdon, name, notes)
TO '/home/user/Desktop/bib_csv/keywords.csv' DELIMITER ',' CSV;
然后您可以将该文件导入新数据库。
如果将旧数据导入 相同 数据库 但导入不同的模式 (例如 old_data
) 而不是 public
你可以只使用简单的 insert
语句复制数据:
insert into public.keywords (keywordsid, createdon, keyword, notes)
select id, createdon, name, notes
from old_data.keywords;