繁体   English   中英

如何将数据从CSV转储复制到具有不同结构的PSQL数据库中?

[英]How do I copy data from a CSV dump into a PSQL database with a different structure?

我目前正在尝试将SQLite3数据库复制到具有DIFFERENT结构的PostgreSQL数据库中。 我怎么做?

到目前为止,我做了什么:

  1. 我转储了SQLite数据库并创建了带有所有表头的CSV文件。
  2. 然后,我创建了一个满足我需要的具有新表结构的新PSQL数据库。
  3. 我还使用旧的SQLite表结构创建了一个PSQL数据库,并从提到的CSV文件导入了数据,因此我可以访问这两个数据库,一个是旧模式,另一个是新模式,以防万一。

问题:

如果表和列的名称与原始名称不同,我不知道如何导入/复制数据。 例如,SQLite数据库和CSV对于“关键字”表具有以下结构:

ID, CreatedBy, CreatedByUserId, CreatedOn, ModifiedBy, ModifiedByUserId, ModifiedOn, Name, Notes, Protected, ReservedData

对于不同名称的表“关键字”,新的PSQL数据库具有以下结构:

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选择性地导入列。 如果您不想使用其他工具,最简单的方法是创建具有原始结构的登台表,然后将COPY到该表中,然后使用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM