我正在阅读一本 SQL 书籍,作者正在使用 Sqlite3,这很棒,因为没有服务器可以搞乱。
在书中作者说要键入:
sqlite3 -echo something.db < some.sql
问题是没有任何东西回显到终端,甚至没有从“<”重定向命令创建的数据库。
有谁知道这是怎么回事?
something.db
是一个现有的数据库。< some.sql
意味着它从该文件中选择数据并将其写入 sqlite 控制台。所以这两个文件都必须存在。
something.db
必须是有效的 l sqlite3 数据库文件(或空文件或不存在的文件);some.sql
必须是包含您的命令的文本文件。
-echo
参数指定它必须在执行之前打印命令。
实际上,您显示的命令是从 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
根据您的评论和终端屏幕截图,我的印象是您的“some.sql”文件可能编码错误和/或以混淆 sqlite的BOM开头。
您可以使用该file
命令找出问题,如果这是问题,请使用iconv
,recode
或您最喜欢的文本编辑器将文件转换为您的终端期望的编码,以及正确的行尾(\n
在 Linux 中又称为“LF”,\r\n
又称为“CRLF”在 Windows 中)。