db-to-sqlite 作者 simonw

标星

README 源代码

db-to-sqlite

PyPI Changelog Tests License

用于将任何 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 选项指定了应包含查询结果的表。

将 db-to-sqlite 与 PostgreSQL 模式一起使用

如果想从 PostgreSQL 数据库复制的表不在默认模式中,可以使用 --postgres-schema 选项指定另一个模式

db-to-sqlite "postgresql://localhost/myblog" blog.db \
    --all \
    --postgres-schema my_schema

将 db-to-sqlite 与 MS SQL 一起使用

获取以下 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

将 db-to-sqlite 与 Heroku Postgres 一起使用

如果在 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)将在每次测试运行时被删除并重新创建。