2013-02-20 33 views
0

我正在读SQL book和笔者使用SQLITE3,这是真棒,因为没有一个服务器与混乱。无论如何,作者在书中说,要输入sqlite3 -echo something.db < some.sql这个问题对于终端来说什么都没有回应,甚至没有从'<'重定向命令创建的数据库。sqlite3的回声和“<”管道命令无法正常运行

有谁知道是怎么回事......这件事?

你的朋友,

user2085446

回答

0

其实,你显示命令是建立从SQL转储一个新的数据库的正确方法。

能否请您出示的sql文件的内容(cat some.sql)?我可以重现所描述的行为的唯一方法是通过给sqlite提供一个空的sql文件。

试试这个命令,看看你是否能得到同样的结果:

$ cat <<EOF > test.sql 
> create table test1 (f1, f2, f3); 
> insert into test1(f1, f2, f3) values ("foo", "bar", "baz"); 
> EOF 
$ sqlite3 -echo test.db < test.sql 
create table test1 (f1, f2, f3); 
insert into test1(f1, f2, f3) values ("foo", "bar", "baz"); 
$ file test.db 
test.db: SQLite 3.x database 
+0

嗨。我可以将SQL转储为.txt或其他东西,否则它看起来像疯狂的字节码。让我在这一分钟上工作。我现在也要试试你的bash-foo! :D – 2013-02-20 06:08:17

+0

我能够获得相同的结果!太棒了。 – 2013-02-20 06:11:04

+0

请找到我的SQL转储:'PRAGMA foreign_keys = OFF; BEGIN TRANSACTION; CREATE TABLE person(id整数主键,名字文本,姓氏文本,年龄整数); INSERT INTO“person”VALUES(0,'beta','bill',59); CREATE TABLE宠物(ID整数主键,名称文本,品种文本,年龄整数,死亡整数); INSERT INTO“pet”VALUES(0,'t.rex','dinosaur',23,0); CREATE TABLE person_pet(person_id integer,pet_id integer); INSERT INTO“person_pet”VALUES(0,0); COMMIT;' – 2013-02-20 06:22:32

0

something.db是现有的数据库。 < some.sql表示它从该文件中选择数据并将其写入sqlite控制台。所以这两个文件都必须存在。

something.db必须是一个有效的sqlite3升数据库文件(或空或不存在的文件); some.sql必须是包含您的命令的文本文件。

-echo PARAMS指定它必须执行之前打印的命令。

+0

这让我想起很多事情。感谢您的答复。有没有办法创建一个空的数据库.db文件,然后将现有的.sql文件加载到它?因为如果我创建一个新的数据库,我必须指定一个新的表和东西,或者当我退出sqlite3时它就会消失... – 2013-02-20 05:49:19

+0

@user如果database.db存在,那么some.sql中的查询将只编辑它。 – n1xx1 2013-02-20 05:50:52

+0

我需要为database.db创建表来加载一个.sql文件到它吗? – 2013-02-20 06:06:20

0

根据您的意见和你的终端屏幕截图,我得到的印象是你的“some.sql”文件可能在错误的编码和/或开始与BOM混淆sqlite。

可以使用file命令查找出来,如果这是问题的使用iconvrecode或你喜欢的文本编辑器将文件转换成你的终端预计,编码,和正确的行结束符(\n又名“LF “在Linux中,\r\n又名Windows中的”CRLF“)。