从Sqlite3转储到PostgreSQL的文件:为什么导入时总会出错?

时间:2012-01-27 09:05:53

标签: postgresql sqlite dump

我在Sqlite3 db中有很多表,现在我想将它导出到PostgreSQL,但是我一直都会遇到错误。 我使用了不同的技术从sqlite转储:

  

.mode csv

     

.header on

     

.out ddd.sql

     

从my_table中选择*

  

.mode insert

     

.out ddd.sql

     

从my_table中选择*

当我尝试通过phppgadmin导入它时,我得到这样的错误:

  

错误:关系“my_table”的列“1”不存在

     

第1行:INSERT INTO“public”。“my_table”(“1”,“1”,“Vitas”,“a @ i.ua”,“..

如何避免此错误?

提前致谢!

2 个答案:

答案 0 :(得分:4)

咆哮

你得到这个“列...不存在”错误INSERT INTO "public"."my_table" ("1", ... - 因为“1”周围的引号表示这是identifier,而不是{{ 3}}

即使您修复此问题,查询仍会出错,因为缺少VAULES关键字,正如Jan在其他答案中注意到的那样。

正确的形式是:

INSERT INTO "public"."my_table" VALUES ('1', ...

如果这个SQL是由sqlite自动生成的,那么sqlite就不好了。

这个伟大的literal只有大约20页的印刷版。我对生成此INSERT的人的建议是:读取它 :-)它会得到回报。

真正的解决方案

现在,重点...要将表从sqlite转移到postgres,你应该使用COPY,因为它比INSERT快。

使用双面理解的CSV格式。

在sqlite3中:

create table tbl1(one varchar(20), two smallint);
insert into tbl1 values('hello',10);
insert into tbl1 values('with,comma', 20);
insert into tbl1 values('with "quotes"', 30);
insert into tbl1 values('with
enter', 40);
.mode csv
.header on
.out tbl1.csv
select * from tbl1;

在PostgreSQL(psql客户端)中:

create table tbl1(one varchar(20), two smallint);
\copy tbl1 from 'tbl1.csv' with csv header delimiter ','
select * from tbl1;

请参阅chapter about SQL syntax

答案 1 :(得分:2)

似乎缺少“VALUES”关键字:

INSERT INTO "public"."my_table" VALUES (...)

但是! - 您必须插入带有适当引号的值 - 文本的单引号和数字的引号。