变更日志¶
3.38 (2024-11-23)¶
插件现在可以通过新的
return_db=True
参数复用sqlite-utils memory
CLI 命令的实现。(#643)table.transform()
现在会在转换表后重新创建索引。如果由于对表的冲突性更改(例如列重命名)而无法重新创建这些索引,则会引发新的sqlite_utils.db.TransformError
异常。感谢 Mat Miller。(#633)table.search()
现在接受一个include_rank=True
参数,使结果行具有一个显示计算出的相关性分数的rank
列。感谢 liunux4odoo。(#628)修复了创建包含至少一个浮点列的严格表时发生的错误。这些
FLOAT
列现在也正确地创建为REAL
类型,但仅限于严格表。(#644)
3.37 (2024-07-18)¶
3.36 (2023-12-07)¶
- 支持在 SQLite STRICT 模式下创建表。感谢 Taj Khattra。(#344)
CLI 命令
create-table
、insert
和upsert
现在都接受--strict
选项。可以创建表的 Python 方法 -
table.create()
和insert/upsert/insert_all/upsert_all
现在都接受可选的strict=True
参数。The
transform
command andtable.transform()
method preserve strict mode when transforming a table.
The
sqlite-utils create-table
command now acceptsstr
,int
andbytes
as aliases fortext
,integer
andblob
respectively. (#606)
3.35.2 (2023-11-03)¶
The
--load-extension=spatialite
option and find_spatialite() utility function now both work correctly onarm64
Linux. Thanks, Mike Coats. (#599)Fix for bug where
sqlite-utils insert
could cause your terminal cursor to disappear. Thanks, Luke Plant. (#433)datetime.timedelta
values are now stored asTEXT
columns. Thanks, Harald Nezbeda. (#522)Test suite is now also run against Python 3.12.
3.35.1 (2023-09-08)¶
Fixed a bug where table.transform() would sometimes re-assign the
rowid
values for a table rather than keeping them consistent across the operation. (#592)
3.35 (2023-08-17)¶
Adding foreign keys to a table no longer uses PRAGMA writable_schema = 1
to directly manipulate the sqlite_master
table. This was resulting in errors in some Python installations where the SQLite library was compiled in a way that prevented this from working, in particular on macOS. Foreign keys are now added using the table transformation mechanism instead. (#577)
This new mechanism creates a full copy of the table, so it is likely to be significantly slower for large tables, but will no longer trigger table sqlite_master may not be modified
errors on platforms that do not support PRAGMA writable_schema = 1
.
A new plugin, sqlite-utils-fast-fks, is now available for developers who still want to use that faster but riskier implementation.
其他更改
The table.transform() method has two new parameters:
foreign_keys=
allows you to replace the foreign key constraints defined on a table, andadd_foreign_keys=
lets you specify new foreign keys to add. These complement the existingdrop_foreign_keys=
parameter. (#577)The sqlite-utils transform command has a new
--add-foreign-key
option which can be called multiple times to add foreign keys to a table that is being transformed. (#585)sqlite-utils convert now has a
--pdb
option for opening a debugger on the first encountered error in your conversion script. (#581)Fixed a bug where
sqlite-utils install -e '.[test]'
option did not work correctly.
3.34 (2023-07-22)¶
此版本引入了一个新的插件系统。在此处阅读更多信息:sqlite-utils 现在支持插件。(#567)
文档描述了如何构建插件。
插件钩子:register_commands(cli),用于插件向
sqlite-utils
添加额外命令。(#569)插件钩子:prepare_connection(conn)。插件可以使用此钩子帮助准备 SQLite 连接,例如注册自定义 SQL 函数。感谢 Alex Garcia。(#574)
sqlite_utils.Database(..., execute_plugins=False)
选项用于禁用插件执行。(#575)sqlite-utils install -e path-to-directory
选项用于安装可编辑的代码。此选项在插件开发期间很有用。(#570)table.create(...)
方法现在接受replace=True
参数以删除并替换同名现有表,或接受ignore=True
参数以在同名表已存在时静默地不执行任何操作。(#568)sqlite-utils insert ... --stop-after 10
选项用于在指定数量的记录后停止插入。此选项对upsert
命令也有效。(#561)insert
命令的--csv
和--tsv
模式现在接受一个--empty-null
选项,这将使 CSV 文件中的空字符串在数据库中存储为null
。(#563)用于重命名表的新方法:
db.rename_table(table_name, new_name)
。(#565)用于重命名表的命令:
sqlite-utils rename-table my.db table_name new_name
。(#565)table.transform(...)
方法现在接受一个可选的keep_table=new_table_name
参数,这将导致原始表在转换结束时被重命名为new_table_name
,而不是被丢弃。(#571)文档现在指出,不带任何参数调用
table.transform()
将重新格式化 SQLite 存储的 SQL 模式,使其更美观。(#564)
3.33 (2023-06-25)¶
如果 sqlean.py 安装在与
sqlite-utils
相同的虚拟环境中,sqlite-utils
现在将使用sqlean.py
代替sqlite3
。这对于 SQLite 版本过旧或对 SQLite 有限制(例如禁用扩展加载或导致sqlite3.OperationalError: table sqlite_master may not be modified
错误)的 Python 环境很有用。(#559)新的
with db.ensure_autocommit_off()
上下文管理器,确保数据库在代码块执行期间处于 autocommit 模式。它被db.enable_wal()
和db.disable_wal()
使用,以确保它们与pysqlite3
和sqlean.py
正确工作。新的
db.iterdump()
方法,提供一个数据库转储的 SQL 字符串迭代器。如果sqlite-dump
可用,则使用它,否则回退到sqlite3
的conn.iterdump()
方法。由于pysqlite3
和sqlean.py
都省略了对iterdump()
的支持,此方法有助于弥补这一差异。
3.32.1 (2023-05-21)¶
文档现在包含关于为
bash
和zsh
设置 shell 自动补全 的说明。(#552)
3.32 (2023-05-21)¶
新的实验性
sqlite-utils tui
接口,由 Trogon 提供支持,用于交互式构建命令行调用。这需要一个可选依赖项,使用sqlite-utils install trogon
安装。文档中有一个截图。(#545)sqlite-utils analyze-tables
命令(文档)现在有一个--common-limit 20
选项,用于更改每列显示的最常见/最不常见值的数量。(#544)sqlite-utils analyze-tables --no-most
和--no-least
选项用于禁用最常见和最不常见值的计算。如果一列只包含
null
值,analyze-tables
将不再尝试计算该列的最常见和最不常见值。(#547)在使用
-c/--column
选项指定不存在的列来调用sqlite-utils analyze-tables
时,现在会显示错误消息。(#548)table.analyze_column()
方法(此处有文档)现在接受most_common=False
和least_common=False
选项,用于禁用这些值的计算。
3.31 (2023-05-08)¶
放弃了对 Python 3.6 的支持。测试现在确保与 Python 3.11 的兼容性。(#517)
在 Apple Silicon 上自动定位 SpatiaLite 扩展。感谢 Chris Amico。(#536)
sqlite-utils query
和sqlite-utils memory
命令的新选项--raw-lines
,它只输出每行第一列的原始值。(#539)修复了如果传入
not_null=
选项时table.upsert_all()
失败的错误。(#538)修复了使用
sqlite-utils insert
时出现的ResourceWarning
警告。(#534)现在在使用无效 JSON 调用
sqlite-utils insert
时,会显示更详细的错误消息。(#532)table.convert(..., skip_false=False)
和sqlite-utils convert --no-skip-false
选项,用于避免 convert() 机制跳过数据库中指定列值为 falsey 的行这一不当特性。默认修复此问题将是向后不兼容的更改,目前正在考虑在将来的 4.0 版本中进行。(#527)现在可以创建带有自引用外键的表。感谢 Scott Perry。(#537)
如果表定义了列的默认值,
sqlite-utils transform
不再中断。感谢 Kenny Song。(#509)修复了重复调用
table.transform()
无法正常工作的错误。感谢 Martin Carpenter。(#525)改进了如果向
rows_from_file()
传递非二进制模式文件对象时的错误消息。(#520)
3.30 (2022-10-25)¶
现已针对 Python 3.11 进行测试。(#502)
新的
table.search_sql(include_rank=True)
选项,将rank
列添加到生成的 SQL 中。感谢 Jacob Chapman。(#480)现在使用
--nl
选项处理换行符分隔的 JSON 文件时会显示进度条。感谢 Mischa Untaga。(#485)新的
db.close()
方法。(#504)传递给 table.convert(…) 的转换函数现在可以返回列表或字典,这些将被作为 JSON 字符串插入到数据库中。(#495)
sqlite-utils install
和sqlite-utils uninstall
命令用于将软件包安装到与sqlite-utils
相同的虚拟环境中,此处有描述。(#483)新的sqlite_utils.utils.flatten() 实用函数。(#500)
关于使用Just 运行测试、linter 和构建文档的文档。
文档现在涵盖了此包的发布过程。
3.29 (2022-08-27)¶
sqlite-utils query
、memory
和bulk
命令现在都接受新的--functions
选项。此选项可以接受一段 Python 代码字符串,代码中定义的任何可调用对象都将作为自定义 SQL 函数供 SQL 查询使用。详细信息请参见定义自定义 SQL 函数。(#471)db[table].create(...)
方法现在接受新的transform=True
参数。如果表已存在,它将根据传递给函数的模式配置选项进行转换。这可能导致列被添加或删除、列类型被更改、列顺序更新或设置列的非空和默认值。(#467)与上述相关,
sqlite-utils create-table
命令现在接受--transform
选项。新的自省属性:
table.default_values
返回一个字典,将每个带有默认值的列名映射到配置的默认值。(#475)--load-extension
选项现在可以提供一个指向已编译 SQLite 扩展模块的路径,后跟入口点名称,两者用冒号分隔 - 例如--load-extension ./lines0:sqlite3_lines0_noread_init
。此功能基于 Alex Garcia 最初贡献给 Datasette 的代码。(#470)使用 db.register_function() 方法注册的函数现在可以使用新的
db.register_function(fn, name=...)
参数指定自定义名称。(#458)sqlite-utils rows 有一个新的
--order
选项,用于指定返回行的排序顺序。(#469)所有接受 Python 代码块的 CLI 选项现在都可以用于定义函数,这些函数可以在同一代码块中访问导入的模块,而无需使用
global
关键字。(#472)修复了
table.extract()
对于包含 null 值的列无法正常工作的错误。感谢 Forest Gregg。(#423)新教程:使用 sqlite-utils 和 Datasette 清理数据 展示了如何使用
sqlite-utils
导入和清理示例 CSV 文件。Datasette 和
sqlite-utils
现在有一个 Discord 社区。在此处加入 Discord。
3.28 (2022-07-15)¶
新的 table.duplicate(new_name) 方法,用于创建模式和行内容匹配的表副本。感谢 David。(#449)
用于复制表的新 CLI 命令
sqlite-utils duplicate data.db table_name new_name
。(#454)sqlite_utils.utils.rows_from_file()
现在是一个有文档记载的 API。它可以用于从包含 CSV、TSV、JSON 或换行符分隔的 JSON 的文件对象中读取一系列字典。可以传入显式格式,也可以尝试自动检测格式。(#443)sqlite_utils.utils.TypeTracker
现在是一个有文档记载的 API,用于检测一系列字符串行的可能列类型,请参见使用 TypeTracker 检测列类型。(#445)sqlite_utils.utils.chunks()
现在是一个有文档记载的 API,用于将迭代器分割成块。(#451)sqlite-utils enable-fts
现在有一个--replace
选项,用于替换表的现有 FTS 配置。(#450)create-index
、add-column
和duplicate
命令现在都接受一个--ignore
选项,用于在数据库状态不适合其操作时忽略错误。(#450)
3.27 (2022-06-14)¶
另请参阅此版本的带注解的发布说明。
文档中的代码示例现在带有“复制到剪贴板”按钮。(#436)
sqlite_utils.utils.utils.rows_from_file()
现在是一个有文档记载的 API,请参见从文件读取行。(#443)rows_from_file()
新增了两个参数,用于处理 CSV 文件中行包含的值多于表头列出的值的情况:ignore_extras=True
和extras_key="name-of-key"
。(#440)sqlite_utils.utils.maximize_csv_field_size_limit()
辅助函数,用于将读取 CSV 文件时的字段大小限制增加到最大值,请参阅 设置最大 CSV 字段大小限制。(#442)table.search(where=, where_args=)
参数用于向搜索查询添加额外的WHERE
子句。where=
参数也可用于table.search_sql(...)
。请参阅 使用 table.search() 进行搜索。(#441)修复了
table.detect_fts()
和其他搜索相关函数可能失败的错误,当两个启用了 FTS 的表的名称互为前缀时。(#434)
3.26.1 (2022-05-02)¶
现在依赖于 click-default-group-wheel,这是一个纯 Python wheel 包。这意味着您可以使用 Pyodide 安装和使用此包,它可以使用 WebAssembly 完全在浏览器中运行 Python。(#429)
通过 Pyodide REPL 试试看
>>> import micropip >>> await micropip.install("sqlite-utils") >>> import sqlite_utils >>> db = sqlite_utils.Database(memory=True) >>> list(db.query("select 3 * 5")) [{'3 * 5': 15}]
3.26 (2022-04-13)¶
3.25.1 (2022-03-11)¶
3.25 (2022-03-01)¶
新增
hash_id_columns=
参数,用于创建基于特定列内容哈希值的主键 - 详情请参阅 基于行内容哈希值设置 ID。(#343)新增 db.sqlite_version 属性,返回一个整数元组,表示 SQLite 的版本,例如
(3, 38, 0)
。修复了 register_function(deterministic=True) 在 SQLite 3.8.3 之前版本导致错误的 bug。(#408)
新增带有文档的 hash_record(record, keys=…) 函数。
3.24 (2022-02-15)¶
sqlite-utils
命令行工具新增 SpatiaLite 辅助功能 - 感谢 Chris Amico。(#398)sqlite-utils create-database 新增
--init-spatialite
选项,用于在新创建的数据库上初始化 SpatiaLite。sqlite-utils add-geometry-column 命令,用于添加几何列。
sqlite-utils create-spatial-index 命令,用于添加空间索引。
db[table].create(..., if_not_exists=True)
选项,仅在表不存在时 创建表。(#397)Database(memory_name="my_shared_database")
参数,用于创建可在多个连接之间共享的 命名内存数据库。(#405)文档现在描述了如何使用
sqlite-utils transform
向 rowid 表添加主键。(#403)
3.23 (2022-02-03)¶
此版本引入了四个用于处理 SpatiaLite 的新实用方法。感谢 Chris Amico。(#385)
sqlite_utils.utils.find_spatialite()
查找 SpatiaLite 模块在磁盘上的位置。db.init_spatialite()
为给定数据库 初始化 SpatiaLite。table.add_geometry_column(...)
向现有表 添加几何列。table.create_spatial_index(...)
为列 创建空间索引。sqlite-utils batch
现在接受--batch-size
选项。(#392)
3.22.1 (2022-01-25)¶
3.22 (2022-01-11)¶
3.21 (2022-01-10)¶
对 CLI 和 Python 库进行了改进,以帮助在创建索引或插入行后运行 ANALYZE,从而在 SQLite 查询规划器针对索引运行时获得更好的性能。
新增三个 CLI 命令:create-database
、analyze
和 bulk
。
更多详细信息和示例可在带注释的发布说明中找到。
新增
sqlite-utils create-database
命令,用于创建新的空数据库文件。(#348)新增用于对数据库、表或索引运行
ANALYZE
的 Python 方法:db.analyze()
和table.analyze()
,请参阅 使用 ANALYZE 优化索引使用。(#366)新增 sqlite-utils analyze 命令,用于使用 CLI 运行
ANALYZE
。(#379)create-index
、insert
和upsert
命令现在新增--analyze
选项,用于在命令完成后运行ANALYZE
。(#379)新增 sqlite-utils bulk 命令,它可以像
sqlite-utils insert
一样(从 JSON、CSV 或 TSV)导入记录,并使用它们批量执行参数化 SQL 查询。(#375)CLI 工具现在也可以使用
python -m sqlite_utils
运行。(#368)使用
--fmt
现在隐式包含--table
,因此您无需同时传递这两个选项。(#374)应用于行的
--convert
函数现在可以就地修改行。The insert-files 命令 支持两个新列:
stem
和suffix
。(#372)--nl
导入选项现在忽略输入中的空行。(#376)修复了当使用
--batch-size 1
向insert
命令进行流式输入时,由于不必要的输入缓冲,看起来只有在摄入几行数据后才会提交的 bug。(#364)
3.20 (2022-01-05)¶
sqlite-utils insert ... --lines
将文件中的行插入到表中,该表有一个line
列,请参阅 使用 --lines 和 --text 插入非结构化数据。sqlite-utils insert ... --text
将文件内容插入到表中,该表有一个text
列和一行数据。sqlite-utils insert ... --convert
允许提供一个 Python 函数,该函数将用于转换正在插入数据库的每一行。请参阅 插入数据时应用转换,其中包括与--lines
和--text
结合使用时的特殊行为详情。(#356)sqlite-utils convert
现在接受代码值为-
,用于从标准输入读取代码。(#353)sqlite-utils convert
现在也接受定义名为convert(value)
函数的代码,请参阅 转换列中的数据。db.supports_strict
属性,显示数据库连接是否支持 SQLite 严格表。修复了
sqlite-utils upsert ... --detect-types
忽略--detect-types
选项的 bug。(#362)
3.19 (2021-11-20)¶
table.lookup() 方法 现在接受与底层
table.insert()
方法匹配的关键字参数:foreign_keys=
、column_order=
、not_null=
、defaults=
、extracts=
、conversions=
和columns=
。您现在还可以传递pk=
来指定用作主键的不同列名。(#342)
3.18 (2021-11-14)¶
table.lookup()
方法现在有一个可选的第二个参数,可用于仅在首次创建记录时填充列,请参阅 使用查找表。(#339)sqlite-utils memory
现在新增--flatten
选项,用于将 嵌套的 JSON 对象展平 到单独的列中,这与sqlite-utils insert
一致。(#332)table.create_index(..., find_unique_name=True)
参数,即使默认名称已被占用,也会为创建的索引找到一个可用的名称。这意味着index-foreign-keys
将能正常工作,即使它尝试创建的索引之一与现有索引名称冲突。(#335)将
py.typed
添加到模块中,以便 mypy 现在应该能正确识别类型注解。感谢 Andreas Longo。(#331)现在依赖于
python-dateutil
,而不是依赖于dateutils
。感谢 Denys Pavlov。(#324)table.create()
(请参阅 显式创建表)现在可以处理dict
、list
和tuple
类型,将它们映射到 SQLite 中的TEXT
列,以便它们可以编码为 JSON 进行存储。(#338)列名中包含方括号(例如 CSV 文件中的
item[price]
)的插入数据现在会将方括号转换为下划线:item_price_
。此前,此类列将被拒绝并报错。(#329)现在也针对 Python 3.10 进行了测试。(#330)
3.17.1 (2021-09-22)¶
sqlite-utils memory 现在在传递给它的文件共享相同文件名时也可以工作。(#325)
sqlite-utils query 在 JSON 模式下未返回行时现在返回
[]
。(#328)
3.17 (2021-08-24)¶
The sqlite-utils memory 命令新增
--analyze
选项,该选项直接对从输入的 CSV 或 JSON 数据创建的内存数据库运行相当于 analyze-tables 命令的操作。(#320)sqlite-utils insert-files 现在除了默认的
BLOB
外,还能够将文件内容插入到TEXT
列中。传递--text
选项或使用content_text
作为列规范。(#319)
3.16 (2021-08-18)¶
为更多方法添加了类型签名,包括
table.resolve_foreign_keys()
、db.create_table_sql()
、db.create_table()
和table.create()
。(#314)新增
db.quote_fts(value)
方法,请参阅 引用用于搜索的字符 - 感谢 Mark Neumann。(#246)table.search()
现在接受可选的quote=True
参数。(#296)CLI 命令
sqlite-utils search
现在接受--quote
选项。(#296)修复了 sqlite-utils insert 的
--no-headers
和--tsv
选项不能一起使用的 bug。(#295)对 API 参考 文档进行了各种小改进。
3.15.1 (2021-08-10)¶
3.15 (2021-08-09)¶
sqlite-utils insert --flatten
选项,用于 展平嵌套的 JSON 对象,创建列名为topkey_nestedkey
的表。(#310)修复了文档中的几个拼写错误,这些错误是 使用 codespell 发现的。
使用
sqlite-utils
CLI 工具时发生的错误现在会显示相关的 SQL 和查询参数(如果可能)。(#309)
3.14 (2021-08-02)¶
此版本引入了新的 sqlite-utils convert 命令 (#251) 和相应的 table.convert(…) Python 方法 (#302)。这些工具可用于将 Python 转换函数应用于表的一个或多个列,既可以就地更新列,也可以使用该列转换后的数据填充一个或多个其他列。
此命令行示例使用 Python 标准库 textwrap 模块 将 articles
表中 content
列的内容包装为 100 个字符
$ sqlite-utils convert content.db articles content \
'"\n".join(textwrap.wrap(value, 100))' \
--import=textwrap
在 Python 代码中,同样的操作如下所示
import sqlite_utils, textwrap
db = sqlite_utils.Database("content.db")
db["articles"].convert("content", lambda v: "\n".join(textwrap.wrap(v, 100)))
有关更多详细信息,请参阅 sqlite-utils convert 命令 和 table.convert(…) Python 方法的完整文档。
本次发布还包含
新增
table.count_where(...)
方法,用于计算表中符合特定 SQLWHERE
子句的行数。(#305)sqlite-utils insert-files 命令 新增
--silent
选项,用于隐藏终端进度条,这与sqlite-utils convert
的--silent
选项一致。(#301)
3.13 (2021-07-24)¶
sqlite-utils schema my.db table1 table2
命令现在接受可选的表名。(#299)sqlite-utils memory --help
现在描述了--schema
选项。
3.12 (2021-06-25)¶
新增 db.query(sql, params) 方法,用于执行 SQL 查询并以 Python 字典迭代器形式返回结果。(#290)
本项目现在使用
flake8
并已开始使用mypy
。(#291)
3.11 (2021-06-20)¶
新增
sqlite-utils memory data.csv --schema
选项,用于输出从一个或多个文件生成的内存数据库的 schema。请参阅 --schema、--analyze、--dump 和 --save。(#288)
3.10 (2021-06-19)¶
此版本引入了 sqlite-utils memory
命令,该命令可用于将 CSV 或 JSON 数据加载到临时内存数据库中,并直接针对这些数据运行 SQL 查询(包括跨多个文件的连接)。
新功能还包括:sqlite-utils insert --detect-types
、sqlite-utils dump
、table.use_rowid
以及一些小修复。
sqlite-utils memory¶
这个 sqlite-utils memory
的例子使用 这个 JSON API 检索 GitHub 上 Dogsheep 组织中所有仓库的信息,按星数排序并输出前五名的表格(使用 -t
)。
$ curl -s 'https://api.github.com/users/dogsheep/repos' \
| sqlite-utils memory - '
select full_name, forks_count, stargazers_count
from stdin order by stargazers_count desc limit 5
' -t
full_name forks_count stargazers_count
--------------------------------- ------------- ------------------
dogsheep/twitter-to-sqlite 12 225
dogsheep/github-to-sqlite 14 139
dogsheep/dogsheep-photos 5 116
dogsheep/dogsheep.github.io 7 90
dogsheep/healthkit-to-sqlite 4 85
该工具也适用于磁盘上的文件。这个例子连接了两个 CSV 文件的数据
$ cat creatures.csv
species_id,name
1,Cleo
2,Bants
2,Dori
2,Azi
$ cat species.csv
id,species_name
1,Dog
2,Chicken
$ sqlite-utils memory species.csv creatures.csv '
select * from creatures join species on creatures.species_id = species.id
'
[{"species_id": 1, "name": "Cleo", "id": 1, "species_name": "Dog"},
{"species_id": 2, "name": "Bants", "id": 2, "species_name": "Chicken"},
{"species_id": 2, "name": "Dori", "id": 2, "species_name": "Chicken"},
{"species_id": 2, "name": "Azi", "id": 2, "species_name": "Chicken"}]
在这里,species.csv
文件变成了 species
表,creatures.csv
文件变成了 creatures
表,输出格式为默认的 JSON。
您还可以使用 --attach
选项将现有的 SQLite 数据库文件附加到内存数据库,以便直接将 CSV 或 JSON 中的数据与现有表连接起来。
这项新功能的完整文档请参见使用内存数据库直接查询数据。 (#272)
sqlite-utils insert --detect-types¶
sqlite-utils insert 命令可用于将 JSON、CSV 或 TSV 文件中的数据插入到 SQLite 数据库文件中。新的 --detect-types
选项(快捷方式 -d
)与 CSV 或 TSV 导入结合使用时,将自动检测文件中的列是整数还是浮点数,而不是将所有内容都视为文本列,并使用相应的模式创建新表。详情请参阅插入 CSV 或 TSV 数据。 (#282)
其他变更¶
错误修复:
table.transform()
在对没有显式主键的表运行时,会错误地创建一个新版本的表,其中包含一个名为rowid
的显式主键列。 (#284)新的
table.use_rowid
内省属性,请参阅.use_rowid。 (#285)新的
sqlite-utils dump file.db
命令输出一个 SQL 转储文件,可用于重新创建数据库。 (#274)-h
现在可用作--help
的快捷方式,感谢 Loren McIntyre。 (#276)现在使用 pytest-cov 和 Codecov 来跟踪测试覆盖率 - 目前为 96%。 (#275)
使用
sqlite-utils query
时发生的 SQL 错误现在显示为 CLI 错误。
3.9.1 (2021-06-12)¶
修复了使用
table.upsert_all()
创建一个只有一列并将其视为主键的表时出现的错误。 (#271)
3.9 (2021-06-11)¶
新的
sqlite-utils schema
命令,用于显示数据库的完整 SQL 模式,请参阅显示模式 (CLI)。 (#268)db.schema
内省属性,向 Python 库公开相同的功能,请参阅显示模式 (Python 库)。
3.8 (2021-06-02)¶
3.7 (2021-05-28)¶
新的
table.pks_and_rows_where()
方法,返回(primary_key, row_dictionary)
元组 - 请参阅列出带有主键的行。 (#240)修复了
table.add_foreign_key()
对包含空格的列操作时出现的错误。 (#238)table_or_view.drop(ignore=True)
选项,用于在表或视图不存在时避免错误。 (#237)sqlite-utils drop-view --ignore
和sqlite-utils drop-table --ignore
选项。 (#237)修复了插入包含非 ASCII 字符串的嵌套 JSON 时出现的错误 - 感谢 Dylan Wu。 (#257)
如果发生因缺少列导致的错误,建议使用
--alter
。 (#259)正确处理以 UTF-8 BOM 开头的 CSV 文件。 (#250)
3.6 (2021-02-18)¶
此版本增加了执行查询连接多个数据库文件数据的能力 - 类似于 Datasette 0.55 中引入的跨数据库查询功能。
db.attach(alias, filepath)
Python 方法可用于将额外数据库附加到同一连接,请参阅Python API 文档中的 db.attach()。 (#113)--attach
选项可直接在命令行上附加额外别名数据库以运行 SQL 查询,请参阅CLI 文档中附加额外数据库。 (#236)
3.5 (2021-02-14)¶
sqlite-utils insert --sniff
选项,用于检测 CSV 文件使用的分隔符和引用字符,请参阅备用分隔符和引用字符。 (#230)table.rows_where()
、table.search()
和table.search_sql()
方法现在都接受可选的offset=
和limit=
参数。 (#231)新的
--no-headers
选项用于sqlite-utils insert --csv
,以处理缺少标题行的 CSV 文件,请参阅没有标题行的 CSV 文件。 (#228)修复了在后续数据块中插入带有额外列的数据时会抛出错误的错误。感谢 @nieuwenhoven 的修复。 (#234)
修复了导入包含超过 128KB 数据列的 CSV 文件时出现的错误。 (#229)
测试套件现在在 CI 中针对 Ubuntu、macOS 和 Windows 运行。感谢 @nieuwenhoven 对 Windows 测试的修复。 (#232)
3.4.1 (2021-02-05)¶
修复了在 3.4 中出现的代码导入错误。 (#226)
3.4 (2021-02-05)¶
sqlite-utils insert --csv
现在接受可选的--delimiter
和--quotechar
选项。请参阅备用分隔符和引用字符。 (#223)
3.3 (2021-01-17)¶
3.2.1 (2021-01-12)¶
修复了
.add_missing_columns()
未考虑列名不区分大小写的问题。 (#221)
3.2 (2021-01-03)¶
此版本引入了一种新机制,通过使用缓存的表计数(存储在 _counts
表中并由触发器更新)来加快 count(*)
查询。该机制在使用触发器缓存表计数中进行了描述,并且可以使用 Python API 方法或新的 enable-counts
CLI 命令启用。 (#212)
table.enable_counts()
方法,用于在特定表上启用这些触发器。db.enable_counts()
方法,用于在数据库中的每个表上启用触发器。 (#213)新的
sqlite-utils enable-counts my.db
命令,用于在所有或特定表上启用计数,请参阅启用缓存计数。 (#214)新的
sqlite-utils triggers
命令,用于列出为数据库或特定表定义的触发器,请参阅列出触发器。 (#218)新的
db.use_counts_table
属性,如果为True
,则导致table.count
从_counts
表读取。 (#215)table.has_counts_triggers
属性,显示表是否已配置新的_counts
数据库触发器。db.reset_counts()
方法和sqlite-utils reset-counts
命令,用于重置_counts
表中的值。 (#219)之前未记录的
db.escape()
方法已重命名为db.quote()
,并且现在包含在文档中:引用字符串用于 SQL。 (#217)新的
table.triggers_dict
和db.triggers_dict
内省属性。 (#211, #216)sqlite-utils insert
现在针对无效的 JSON 显示更有用的错误消息。 (#206)
3.1.1 (2021-01-01)¶
修复了由于
optimize
有时会创建更大的数据库文件而导致的测试失败。 (#209)README 现在包含
brew install sqlite-utils
安装方法。
3.1 (2020-12-12)¶
3.0 (2020-11-08)¶
此版本引入了新的 sqlite-utils search
命令,用于搜索表,请参阅执行搜索。 (#192)
table.search()
方法已重新设计,请参阅使用 table.search() 进行搜索。 (#197)
此版本包含一些次要的向后不兼容的更改,因此版本号升级到 3.0。这些更改(不应影响大多数用户)如下:
用于输出 CSV 的
-c
快捷选项不再可用。现在需要使用完整的--csv
选项。用于
--fmt
的-f
快捷方式也已移除 - 请使用--fmt
。table.search()
方法现在默认为按相关性排序,而不是按rowid
排序。 (#198)table.search()
方法现在返回一个生成器,用于处理 Python 字典列表。它以前返回的是元组列表。
本次发布还包含
query
、tables
、rows
和search
CLI 命令现在接受新的--tsv
选项,该选项以 TSV 格式输出结果。 (#193)新的
table.virtual_table_using
属性,用于判断表是否为虚拟表,如果是,则返回虚拟表的大写类型(例如FTS4
或FTS5
)。如果表不是虚拟表,则返回None
。 (#196)新的
table.search_sql()
方法返回用于搜索表的 SQL,请参阅使用 table.search_sql() 构建 SQL 查询。sqlite-utils rows
现在接受多个可选的-c
参数,用于指定要返回的列。 (#200)
自 3.0a0 alpha 版本以来的变更
sqlite-utils search
命令现在默认返回所有结果,除非您添加--limit 20
选项。sqlite-utils search -c
和table.search(columns=[])
选项现在得到充分遵守。 (#201)
2.23 (2020-10-28)¶
2.22 (2020-10-16)¶
2.21 (2020-09-24)¶
table.extract()
和sqlite-utils extract
现在运行速度快得多 - 一个示例操作从十二分钟减少到仅需四秒! (#172)sqlite-utils extract
不再显示进度条,因为它速度已足够快,无需进度条。为
table.transform()
新增column_order=
选项,可用于更改表中的列顺序。 (#175)新增
sqlite-utils transform --column-order=
选项(带-o
快捷方式)用于更改列顺序。 (#176)参数
table.transform(drop_foreign_keys=)
和选项sqlite-utils transform --drop-foreign-key
已更改。它们现在只接受列名,而不再需要同时指定列、其他表和另一列这三个参数。从技术上讲,这是一个向后不兼容的更改,但我选择不提升主版本号,因为 transform 功能非常新。 (#177)表格的
.disable_fts()
、.rebuild_fts()
、.delete()
、.delete_where()
和.add_missing_columns()
方法现在都return self
,这意味着它们可以与其他表格操作链式调用。
2.20 (2020-09-22)¶
此版本引入了两个关键新功能:transform (#114) 和 extract (#42)。
Transform¶
SQLite 的 ALTER TABLE 存在一些已知的限制。table.transform()
Python 方法和 sqlite-utils transform
CLI 命令通过创建一个具有所需结构的新表、将数据复制过去,然后删除旧表并替换为新表的模式来规避这些限制。
您可以使用这些工具更改列类型、重命名列、删除列、添加和删除 NOT NULL
和默认值、删除外键约束等。有关如何使用它们的完整详细信息,请参阅转换表(CLI)和转换表(Python 库)文档。
Extract¶
有时数据库表——特别是从 CSV 文件导入的表——会包含重复数据。一个 Trees
表可能包含一个 Species
列,其中只有几十个唯一值,而表本身包含数千行。
table.extract()
方法和 sqlite-utils extract
命令可以将一列或多列提取到单独的查找表中,并从原始表建立外键关系。
Python 库的extract() 文档详细描述了提取的工作原理,CLI 文档中的将列提取到单独的表中包含详细示例。
其他更改¶
@db.register_function
装饰器可用于快速将 Python 函数注册为自定义 SQL 函数,请参阅注册自定义 SQL 函数。 (#162)table.rows_where()
方法现在接受一个可选的select=
参数,用于指定应选择哪些列,请参阅列出行。
2.19 (2020-09-20)¶
2.18 (2020-09-08)¶
2.17 (2020-09-07)¶
此版本解决了替换 FTS 表中的行可能导致相关 *_fts_docsize
表中不必要行数量不断增加的错误。 (#149)
2.16.1 (2020-08-28)¶
2.16 (2020-08-21)¶
2.15.1 (2020-08-12)¶
除了 wheel 包外,现在还可以在 PyPI 上获取
sdist
包。 (#133)
2.15 (2020-08-10)¶
新增
db.enable_wal()
和db.disable_wal()
方法,用于启用和禁用数据库文件的预写式日志(Write-Ahead Logging) - 请参阅 Python API 文档中的WAL 模式。同时新增
sqlite-utils enable-wal file.db
和sqlite-utils disable-wal file.db
命令,用于在命令行上执行相同操作,请参阅WAL 模式(CLI)。 (#132)
2.14.1 (2020-08-05)¶
文档改进。
2.14 (2020-08-01)¶
insert-files 命令现在可以从标准输入读取:
cat dog.jpg | sqlite-utils insert-files dogs.db pics - --name=dog.jpg
。 (#127)现在可以使用 enable_fts() 的新参数
tokenize=
来指定全文搜索分词器。这意味着您可以通过运行db["articles"].enable_fts(["headline", "body"], tokenize="porter")
对表启用 Porter 词干分析。 (#130)您还可以使用 sqlite-utils enable-fts CLI 命令,通过新的
--tokenize
选项设置自定义分词器。
2.13 (2020-07-29)¶
现在支持
memoryview
和uuid.UUID
对象。memoryview
对象将使用BLOB
存储,uuid.UUID
对象将使用TEXT
存储。 (#128)
2.12 (2020-07-27)¶
此版本的主题是改进处理二进制数据的工具。新的 insert-files
命令可用于将二进制文件直接插入到数据库表中,并且其他命令也通过改进对 BLOB 列的支持得到增强。
sqlite-utils insert-files my.db gifs *.gif
现在可以将文件内容插入到指定的表中。可以自定义表中的列以包含从文件派生的不同元数据。请参阅从文件插入数据。 (#122)sqlite-utils query
新增--raw
选项 - 用于仅输出单个原始列值 - 请参阅返回原始数据,例如二进制内容。 (#123)现在可以使用相同格式的 JSON base64 对象来插入二进制数据 - 请参阅插入 JSON 数据。 (#126)
sqlite-utils query
命令现在接受命名参数,例如sqlite-utils :memory: "select :num * :num2" -p num 5 -p num2 6
- 请参阅返回 JSON。 (#124)
2.11 (2020-07-08)¶
2.10.1 (2020-06-23)¶
添加了
table.pks
内省属性的文档。 (#116)
2.10 (2020-06-12)¶
sqlite-utils query
命令现在支持 UPDATE/INSERT/DELETE 以及 SELECT。 (#115)
2.9.1 (2020-05-11)¶
在PyPI listing中添加了自定义项目链接。
2.9 (2020-05-10)¶
2.8 (2020-05-03)¶
2.7.2 (2020-05-02)¶
2.7.1 (2020-05-01)¶
2.7 (2020-04-17)¶
.insert()
、.insert_all()
、.upsert()
和.upsert_all()
方法新增columns=
参数,用于覆盖列的自动检测类型,并指定创建表时应添加的附加列。请参阅自定义列顺序和列类型。 (#100)
2.6 (2020-04-15)¶
2.5 (2020-04-12)¶
2.4.4 (2020-03-23)¶
修复了仅包含 null 值的列未能正确创建的错误。 (#95)
2.4.3 (2020-03-23)¶
列类型建议代码不再受 null 值干扰。 (#94)
2.4.2 (2020-03-14)¶
2.4.1 (2020-03-01)¶
table.enable_fts()
现在适用于包含空格的列。 (#90)
2.4 (2020-02-26)¶
2.3.1 (2020-02-10)¶
table.create_index()
现在适用于包含空格的列。 (#85)
2.3 (2020-02-08)¶
table.exists()
现在是一个方法,而不是属性。这在之前并非文档化 API 的一部分,因此我认为这是一个非破坏性更改。 (#83)
2.2.1 (2020-02-06)¶
修复了 .upsert(..., hash_id="pk")
抛出错误的错误 (#84)。
2.2 (2020-02-01)¶
新增功能:sqlite_utils.suggest_column_types([records])
返回记录列表的建议列类型。请参阅建议列类型。 (#81)。
这取代了未文档化的 table.detect_column_types()
方法。
2.1 (2020-01-30)¶
新增功能:可以将 conversions={...}
传递给 .insert()
系列函数,以指定应应用于插入或更新值的 SQL 转换。请参阅使用 SQL 函数转换列值。 (#77)。
2.0.1 (2020-01-05)¶
.upsert()
和 .upsert_all()
方法现在在未通过 pk=
指定主键列的情况下调用时,会抛出 sqlite_utils.db.PrimaryKeyRequired
异常 (#73)。
2.0 (2019-12-29)¶
此版本更改了 upsert
的行为。这是一个破坏性更改,因此版本号为 2.0
。
upsert
命令行工具以及 .upsert()
和 .upsert_all()
Python API 方法的行为已更改。它们以前会完全替换受影响的记录:现在,它们会更新现有记录上指定的值,但其他列不受影响。
有关完整详细信息,请参阅使用 Python API 更新插入数据 (Upsert)和使用 CLI 更新插入数据 (Upsert)。
如果您想要旧的行为——即记录被完全替换——您可以在命令行上使用 $ sqlite-utils insert ... --replace
,并在 Python API 中使用 .insert(..., replace=True)
和 .insert_all(..., replace=True)
。更多信息请参阅使用 Python API 插入并替换数据和使用 CLI 插入并替换数据。
有关此更改的完整背景信息,请参阅issue #66。
1.12.1 (2019-11-06)¶
修复了调用
.insert_all()
和.upsert_all()
时传入空列表会抛出错误的错误 (#52)
1.12 (2019-11-04)¶
用于删除记录的 Python 库实用工具 (#62)
1.11 (2019-09-02)¶
创建触发器以自动使 FTS 表与新插入、更新和删除的记录保持同步的选项。感谢 Amjith Ramanujam! (#57)
sqlite-utils enable-fts ... --create-triggers
- 请参阅使用 CLI 配置全文搜索db["tablename"].enable_fts(..., create_triggers=True)
- 请参阅使用 Python 库配置全文搜索
1.10 (2019-08-23)¶
内省和查询视图的能力 (#54)
db.view_names()
方法和db.views
属性单独的
View
和Table
类,都继承自新的Queryable
类view.drop()
方法
请参阅列出视图。
1.9 (2019-08-04)¶
1.8 (2019-07-28)¶
1.7.1 (2019-07-28)¶
1.7 (2019-07-24)¶
支持查找表。
1.6 (2019-07-18)¶
sqlite-utils insert
现在可以通过新的--tsv
选项接受 TSV 数据 (#41)
1.5 (2019-07-14)¶
1.4.1 (2019-07-14)¶
各种次要文档修复:自 1.4 以来的更改
1.4 (2019-06-30)¶
1.3 (2019-06-28)¶
新增一次添加多个外键约束的机制:db.add_foreign_keys() 文档 (#31)
1.2.2 (2019-06-25)¶
修复了
datetime.time
未正确处理的错误
1.2.1 (2019-06-20)¶
在尝试添加外键之前检查列是否存在 (#29)
1.2 (2019-06-12)¶
改进了外键定义:您不再需要同时指定
column
、other_table
和other_column
来定义外键 - 如果省略other_table
或other_column
,脚本将通过内省数据库尝试猜测正确的值。详细信息请参阅添加外键约束。 (#25)创建表时设置
NOT NULL
约束和DEFAULT
值的能力 (#24)。文档:设置默认值和非空约束(Python API)、设置默认值和非空约束(CLI)新增
not_null_default=X
/--not-null-default
支持,用于添加新列时设置NOT NULL DEFAULT 'x'
。文档:添加列(Python API)、添加列(CLI)
1.1 (2019-05-28)¶
支持
ignore=True
/--ignore
,用于忽略主键已存在的插入记录 (#21) - 文档:插入数据(Python API)、插入数据(CLI)使用
fk=...
/--fk
添加外键引用列的能力 (#16) - 文档:添加列(Python API)、添加列(CLI)
1.0.1 (2019-05-27)¶
sqlite-utils rows data.db table --json-cols
- 修复了未遵循--json-cols
的错误
1.0 (2019-05-24)¶
- 尝试插入或更新带有额外字段的数据时自动添加新列的选项
sqlite-utils insert ... --alter
- 请参阅使用 sqlite-utils CLI 自动添加列db["tablename"].insert(record, alter=True)
- 请参阅使用 Python API 自动添加列
新增
--json-cols
选项,用于输出嵌套 JSON,请参阅嵌套 JSON 值
0.14 (2019-02-24)¶
创建唯一索引的能力:
db["mytable"].create_index(["name"], unique=True)
db["mytable"].create_index(["name"], if_not_exists=True)
$ sqlite-utils create-index mydb.db mytable col1 [col2...]
,请参阅创建索引table.add_column(name, type)
方法,请参阅添加列$ sqlite-utils add-column mydb.db mytable nameofcolumn
,请参阅添加列(CLI)db["books"].add_foreign_key("author_id", "authors", "id")
,请参阅添加外键约束$ sqlite-utils add-foreign-key books.db books author_id authors id
,请参阅添加外键约束(CLI)改进的(但向后不兼容)
foreign_keys=
参数用于各种方法,请参阅指定外键
0.13 (2019-02-23)¶
新的
--table
和--fmt
选项可用于以各种可视化表格格式输出查询结果,请参阅表格格式输出新的
hash_id=
参数现在可用于根据行内容的哈希值设置 ID现在可以推断 numpy int、uint 和 float 值的正确列类型
table.last_id
已重命名为table.last_rowid
如果指定了
pk=
,table.last_pk
现在包含最后插入的主键CREATE TABLE
生成的 schema 缩进更美观
0.12 (2019-02-22)¶
添加了
db[table].rows
迭代器 - 请参阅列出行将
sqlite-utils json
和sqlite-utils csv
替换为新的默认子命令sqlite-utils query
,该命令默认输出 JSON,并带有格式选项--nl
、--csv
和--no-headers
- 请参阅返回 JSON和返回 CSV 或 TSV新的
sqlite-utils rows data.db name-of-table
命令,请参阅返回表中的所有行sqlite-utils table
命令现在接受--counts
和--columns
选项,以及标准的输出格式选项,请参阅列出表
0.11 (2019-02-07)¶
新增启用表和列 FTS 的命令
sqlite-utils enable-fts db.db mytable col1 col2
请参阅配置全文搜索。
0.10 (2019-02-06)¶
处理 datetime.date
和 datetime.time
值。
高效插入 CSV 行的新选项
sqlite-utils insert db.db foo - --csv
0.9 (2019-01-27)¶
改进了对换行符分隔 JSON 的支持。
sqlite-utils insert
有两个新的命令行选项
--nl
表示“期望换行符分隔的 JSON”。这是一种加载大量数据的极其高效的方法,特别是当您将其管道到标准输入时。--batch-size=1000
允许您增加批量大小(默认为 100)。每插入 X 条记录将提交一次。这也控制了在检测数据所需的 SQL 表 schema 时考虑的初始记录数量。
在 Python API 中,table.insert_all(...)
方法现在可以接受生成器以及对象列表。无论生成器产生多少记录,这将高效地填充表。
Database()
构造函数现在除了接受字符串或现有 SQLite 连接对象外,还可以接受 pathlib.Path
对象。
0.8 (2019-01-25)¶
两个新命令:sqlite-utils csv
和 sqlite-utils json
这些命令执行 SQL 查询并以 CSV 或 JSON 格式返回结果。详细信息请参阅返回 CSV 或 TSV 和返回 JSON。
$ sqlite-utils json --help
Usage: sqlite-utils json [OPTIONS] PATH SQL
Execute SQL query and return the results as JSON
Options:
--nl Output newline-delimited JSON
--arrays Output rows as arrays instead of objects
--help Show this message and exit.
$ sqlite-utils csv --help
Usage: sqlite-utils csv [OPTIONS] PATH SQL
Execute SQL query and return the results as CSV
Options:
--no-headers Exclude headers from CSV output
--help Show this message and exit.
0.7 (2019-01-24)¶
此版本实现了带有多个有用子命令的 sqlite-utils
命令行工具。
sqlite-utils tables demo.db
列出数据库中的表sqlite-utils tables demo.db --fts4
仅显示 FTS4 表sqlite-utils tables demo.db --fts5
仅显示 FTS5 表sqlite-utils vacuum demo.db
对数据库运行 VACUUMsqlite-utils optimize demo.db
对所有 FTS 表运行 OPTIMIZE,然后运行 VACUUMsqlite-utils optimize demo.db --no-vacuum
运行 OPTIMIZE 但跳过 VACUUM
两个最有用的子命令是 upsert
和 insert
,它们允许您摄取包含一条或多条记录的 JSON 文件,如果相应的表尚不存在,则创建具有正确列的表。详细信息请参阅插入 JSON 数据。
sqlite-utils insert demo.db dogs dogs.json --pk=id
将dogs.json
中的新记录插入到dogs
表中sqlite-utils upsert demo.db dogs dogs.json --pk=id
更新插入记录,替换具有重复主键的任何记录
一个向后不兼容的更改:db["table"].table_names
属性现在是一个方法
db["table"].table_names()
返回表名列表db["table"].table_names(fts4=True)
仅返回 FTS4 表列表db["table"].table_names(fts5=True)
仅返回 FTS5 表列表
其他一些更改
大量更新的文档,包括对新命令行工具的全面覆盖
允许列名使用保留字(使用正确的 SQL 转义)
添加了对 bytes 和 datetime.datetime 的自动列支持
0.6 (2018-08-12)¶
.enable_fts()
现在接受可选参数fts_version
,默认为FTS5
。如果您的 Python 版本捆绑的 SQLite 不支持 FTS5,请使用FTS4
新的可选
column_order=
参数用于.insert()
和相关方法,用于在创建数据库表时提供列的部分或完整的期望顺序新增文档用于
.insert_all()
和.upsert()
以及.upsert_all()
0.5 (2018-08-05)¶
db.tables
和db.table_names
内省属性db.indexes
属性用于内省索引table.create_index(columns, index_name)
方法db.create_view(name, sql)
方法表方法现在可以链式调用,并添加了
table.last_id
用于访问最后插入的 row ID
0.4 (2018-07-31)¶
enable_fts()
、populate_fts()
和search()
表方法
0.3.1 (2018-07-31)¶
文档化相关项目
为文档添加徽章
0.3 (2018-07-31)¶
表示 SQLite 数据库中表的新
Table
类
0.2 (2018-07-28)¶
首次发布到 PyPI