使用命令行运行Sqlite3脚本

33

我正在编写一个shell脚本来传输项目文件,其中一部分涉及将我的数据库中的一些重要表格进行传输。

我在文件SQLTableTransfer中存储了以下内容:

.o MyTable1.sql;
.dump MyTable1;

.o MyTable2.sql;
.dump MyTable2;

.o MyTable3.sql;
.dump MyTable3;

冒险一试

$ sqlite3 SQLTableTransfer

但这只是打开了Sqlite3 shell。从命令行运行这样的脚本的正确方法是什么?


https://dev59.com/EWkw5IYBdhLWcg3wNoCh - Zach Thacker
我看到过类似的东西,但那是从命令行执行SQL语言,我需要它执行Sqlite语言。 - rwolst
如果这些是在sqlite3命令行中输入的命令,那么这种方法仍然适用。总体思路是将文件内容发送到sqlite3的标准输入。因此,它不使用键盘输入,而是使用来自该文件的输入。您已经尝试过这个了吗? - Zach Thacker
4个回答

59

你传递给 sqlite3 程序的参数是数据库文件名。

要从文件执行命令,必须将输入重定向到该文件:

$ sqlite3 mydatabase.db < SQLTableTransfer

或者告诉它从那个文件中读取:

$ sqlite3 mydatabase.db ".read SQLTableTransfer"

好的,谢谢。但是由于某种原因,当我使用.dump时,它只会转储表格:`PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; COMMIT;` - rwolst
1
最近我一直在尝试导入一个包含国际字符(如德语_äöüß_)的utf8编码的sql脚本,结果发现第二种方法是唯一可行的方式。其他任何解决方案都只会导入问号(我需要它用于PowerShell脚本)。 - t3chb0t
@t3chb0t 这个问题不是关于Windows的。 - CL.
2
没关系 :) 它已经有超过2k的浏览量,所以我猜一般对导入sqlite3中的sql脚本感兴趣的人都会来(就像我一样),尽管与Windows没有直接关联,但这个解决方案对我有效。我认为提到utf8连接很重要,因为在某些系统上(例如Windows)否则无法正常工作。我在找到这个之前已经谷歌了一个小时。 - t3chb0t
如果名称“SQLTableTransfer”正在更改并存储在变量f中,那该怎么办?就像从bash调用的for f in *.csv一样? - Guilherme Salomé
1
@GuilhermeSalomé 如何在shell中使用变量将是一个不同的问题。 - CL.

5

对于Windows CLI而言,假设您已经加载了数据库:

sqlite> .read C:\\somesubdir\\some.sql

3
您可以按以下方式获取空间表的列表: echo "SELECT f_table_name FROM geometry_columns;" | spatialite -noheader -silent your_db.sqlite 该命令将在您的数据库中查询几何列,并返回表名列表。请注意,这需要使用spatialite软件包。

3

对于那些想要将此内容直接转储到他们的.bashrc文件中的懒人:

### Execute an sqlite3 file on a given db
sql3-exec () {
  # TODO: write a  --help flag that doubles as error handling
  # TODO: Ensure that $1 is a db; Else display --help
  # TODO: Ensure that $2 is a .sql file; Else display --help
  # TODO: Probably store a backup (or at least a flag)...
  sqlite3 $1 ".read $2"
  true
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接