用于将任何 SQL 数据库中的表或查询导出到 SQLite 文件的命令行工具。
从 PyPI 安装,如下所示
pip install db-to-sqlite
如果想与 MySQL 一起使用,可以像这样安装额外的依赖项
pip install 'db-to-sqlite[mysql]'
在 OS X 上安装 mysqlclient
库可能比较棘手 - 我发现 这个方法 可以奏效(在安装 db-to-sqlite
之前运行它)。
对于 PostgreSQL,使用这个方法
pip install 'db-to-sqlite[postgresql]'
Usage: db-to-sqlite [OPTIONS] CONNECTION PATH
Load data from any database into SQLite.
PATH is a path to the SQLite file to create, e.c. /tmp/my_database.db
CONNECTION is a SQLAlchemy connection string, for example:
postgresql://localhost/my_database
postgresql://username:passwd@localhost/my_database
mysql://root@localhost/my_database
mysql://username:passwd@localhost/my_database
More: https://docs.sqlalchemy.org.cn/en/13/core/engines.html#database-urls
Options:
--version Show the version and exit.
--all Detect and copy all tables
--table TEXT Specific tables to copy
--skip TEXT When using --all skip these tables
--redact TEXT... (table, column) pairs to redact with ***
--sql TEXT Optional SQL query to run
--output TEXT Table in which to save --sql query results
--pk TEXT Optional column to use as a primary key
--index-fks / --no-index-fks Should foreign keys have indexes? Default on
-p, --progress Show progress bar
--postgres-schema TEXT PostgreSQL schema to use
--help Show this message and exit.
例如,要将 PostgreSQL 数据库中 blog_entry
表的内容保存到名为 blog.db
的本地文件中,可以这样做
db-to-sqlite "postgresql://localhost/myblog" blog.db \
--table=blog_entry
可以多次指定 --table
。
也可以保存所有表中的数据,有效地创建一个整个数据库的 SQLite 副本。任何外键关系都将被检测到并添加到 SQLite 数据库中。例如
db-to-sqlite "postgresql://localhost/myblog" blog.db \
--all
运行 --all
时,可以使用 --skip
指定要跳过的表
db-to-sqlite "postgresql://localhost/myblog" blog.db \
--all \
--skip=django_migrations
如果想保存自定义 SQL 查询的结果,可以这样做
db-to-sqlite "postgresql://localhost/myblog" output.db \
--output=query_results \
--sql="select id, title, created from blog_entry" \
--pk=id
--output
选项指定了应包含查询结果的表。
如果想从 PostgreSQL 数据库复制的表不在默认模式中,可以使用 --postgres-schema
选项指定另一个模式
db-to-sqlite "postgresql://localhost/myblog" blog.db \
--all \
--postgres-schema my_schema
获取以下 MS SQL 连接所需的连接字符串的最佳方法是使用标准库中的 urllib,如下所示
params = urllib.parse.quote_plus(
"DRIVER={SQL Server Native Client 11.0};"
"SERVER=localhost;"
"DATABASE=my_database;"
"Trusted_Connection=yes;"
)
上述内容将解析为
DRIVER%3D%7BSQL+Server+Native+Client+11.0%7D%3B+SERVER%3Dlocalhost%3B+DATABASE%3Dmy_database%3B+Trusted_Connection%3Dyes
然后可以在下面的 odbc_connect 中使用上面的字符串
mssql+pyodbc:///?odbc_connect=DRIVER%3D%7BSQL+Server+Native+Client+11.0%7D%3B+SERVER%3Dlocalhost%3B+DATABASE%3Dmy_database%3B+Trusted_Connection%3Dyes
mssql+pyodbc:///?odbc_connect=DRIVER%3D%7BSQL+Server+Native+Client+11.0%7D%3B+SERVER%3Dlocalhost%3B+DATABASE%3Dmy_database%3B+UID%3Dusername%3B+PWD%3Dpasswd
如果在 Heroku 上使用其 Postgres 数据库产品 运行应用程序,可以使用 heroku config
命令获取兼容的连接字符串
$ heroku config --app myappname | grep HEROKU_POSTG
HEROKU_POSTGRESQL_OLIVE_URL: postgres://username:password@ec2-xxx-xxx-xxx-x.compute-1.amazonaws.com:5432/dbname
可以将此连接字符串传递给 db-to-sqlite
,以从 Heroku 实例的数据创建一个本地 SQLite 数据库。
甚至可以使用 bash 一行命令来完成此操作
$ db-to-sqlite $(heroku config --app myappname | grep HEROKU_POSTG | cut -d: -f 2-) \
/tmp/heroku.db --all -p
1/23: django_migrations
...
17/23: blog_blogmark
[####################################] 100%
...
- Datasette: 一个用于浏览和发布数据的工具。与使用
db-to-sqlite
生成的 SQLite 文件配合使用效果很好。 - sqlite-utils: 用于操作 SQLite 数据库的 Python 命令行工具和库。
- csvs-to-sqlite: 将 CSV 文件转换为 SQLite 数据库。
要在本地设置此工具,首先克隆代码。然后创建一个新的虚拟环境
cd db-to-sqlite
python3 -m venv venv
source venv/bin/activate
或者如果使用 pipenv
pipenv shell
现在安装依赖项和测试依赖项
pip install -e '.[test]'
运行测试
pytest
如果未安装额外的 MySQL 或 PostgreSQL 依赖项,将跳过对它们的测试。
可以这样安装这些额外依赖项
pip install -e '.[test_mysql,test_postgresql]'
如果无法安装 test_postgresql
extra 所使用的 psycopg2
依赖项,可以改用 pip install psycopg2-binary
。
请参阅 使用 Homebrew 运行 MySQL 服务器 获取在 macOS 上针对 MySQL 运行测试的技巧,包括如何安装 mysqlclient
依赖项。
PostgreSQL 和 MySQL 测试默认期望在本地主机上运行。可以使用环境变量将它们指向不同的测试数据库服务器
MYSQL_TEST_DB_CONNECTION
- 默认为mysql://root@localhost/test_db_to_sqlite
POSTGRESQL_TEST_DB_CONNECTION
- 默认为postgresql://localhost/test_db_to_sqlite
您在环境变量中指定的数据库(默认为 test_db_to_sqlite
)将在每次测试运行时被删除并重新创建。