我今天发布了Datasette 0.63 。这些是带注释的发行说明。
特征
- 现在针对 Python 3.11 进行了测试。
datasette publish
和datasette package
使用的 Docker 容器现在都使用该版本的 Python。 ( #1853 )
Python 3.11几天前发布,该版本的亮点之一是在性能方面投入了大量工作。
我运行了一个非常基本的负载测试,比较了在 Python 3.10 和 3.11 上运行的 Datasette…,从 413.56 个请求/秒提高了 533.89 个请求/秒 – 提高了 29%!
Datasette 在 Python 3.7 及更高版本上工作(并经过测试),但它有一些机制可以为您烘焙一个新的 Docker 容器。这种性能提升非常显着,以至于我花时间使用3.11.0-slim-bullseye
基础映像将这些容器升级到 Python 3.11。
--load-extension
选项现在支持入口点。谢谢,亚历克斯·加西亚。 ( #1789 )
Alex 继续做着 惊人的工作,记录了构建 SQLite 扩展的过程。事实证明,一个扩展可以提供多种变体——他在自己的一些中使用了这个技巧。他将此修复程序贡献给 Datasette,我也将相同的功能移植到 sqlite-utils 。
- 现在可以使用新的
facet_size
表元数据选项为每个表设置构面大小。 ( #1804 )
Charles Nepote 在Datasette Discord上提出的建议。如果您正在处理更大的数据库,那就太好了。
- truncate_cells_html设置现在也会影响列中的长 URL。 ( #1805 )
查尔斯也建议。这有助于使带有巨大链接 URL 的单元格保持可读性。
- 非 JavaScript SQL 编辑器 textarea 现在增加高度以适应 SQL 查询。 ( #1786 )
我实现这一点的部分原因是我仍然关心 Datasette 在 JavaScript 不加载时的工作情况,但主要是针对Datasette Lite ,它仍然没有像常规 Datasette 中使用的 CodeMirror 编辑器那样加载 JavaScript 小部件的解决方案。
- 现在在长值中以更好的换行符显示构面。谢谢,丹尼尔·雷奇。 ( #1794 )
这使用了word-break: break-all;
CSS 属性。
我添加这个是为了响应由于有人误解设置而导致的错误报告,并添加了一个被默默忽略的无效设置。现在,如果您尝试使用不存在的设置,Datasette 将引发错误,这是一个更好的用户体验。
- SQL 查询现在可以包括前导 SQL 注释,使用
/* ... */
或-- ...
语法。谢谢,查尔斯·尼波特。 ( #1860 )
Charles 指出,能够在 SQL 查询的开头包含描述性注释很有用,但 Datasette 拒绝以注释开头的查询。
解决这个问题需要一些正则表达式向导。这是最终的表达式加上可视化:
^\s*((?:\-\-.*?\n\s*)|(?:\/\*((?!\*\/)[\s\S])*\*\/)\s*)*\s*select\b
最棘手的部分是我想匹配这样的评论:
/* This is a comment that spans multiple lines */
但是……我不想因为*/
出现在字符串文字中而感到困惑。我想匹配/*
,然后匹配任何不是结束注释标记(包括换行符)的字符序列 – 然后*/
。
这就是这样做的:
\/\*((?!\*\/)[\s\S])*\*\/)
\/\*
和\*\/
是文字/*
和*/
的转义序列。
((?!\*\/)[\s\S])
表示“多次匹配不是结束注释标记的任何字符序列”。 \s\S
表示空格和非空格字符 – 这是解决.
不匹配换行符。
- SQL 查询现在在因时间限制错误而终止时重新显示。 ( #1819 )
以前错误消息不包括您输入的 SQL,因此您必须点击“返回”来恢复您的查询。
datasette inspect
是一个相当晦涩的 Datasette 功能。对 SQLite 文件运行它,它会转储出表示一些关键统计信息的 JSON——最重要的是每个表中的行数。
如果数据库是不可变的,您可以使用对该 JSON 文件的引用(使用--inspect-data path
选项)启动 Datasette,Datasette 将使用该数据来避免在显示有关数据库的信息时对行进行计数 – a潜在的昂贵操作。
大多数人永远不会直接使用此功能,但各种datasette publish
命令(包括datasette publish cloudrun
)将其用作构建 Docker 映像的过程的一部分,因此它实际上是相当有影响力的。
Forest Gregg 发现了一种可以进一步增加服务器启动时间的方法,它跳过了 Datasette 计算数据库文件哈希的步骤,因为它也包含在inspect-data
文件中。
如果通过将 Datasette 指向目录datasette path/to/dir
启动 Datasette,它现在将加载该目录中的任何*.sqlite
或*.sqlite3
文件以及任何*.db
文件。
- 面包屑导航显示现在尊重当前用户的权限。 ( #1831 )
这项改进源于我在Datasette Cloud上所做的工作,请参阅之前的周记。
插件钩子和内部结构
- prepare_jinja2_environment(env, datasette)插件挂钩现在接受可选的
datasette
参数。 Hook 实现现在也可以返回一个async
函数,该函数将自动等待。 ( #1809 )
当我构建datasette-edit-templates插件时,我发现自己想要访问prepare_jinja2_environment()
插件挂钩实现中的datasette
对象。
由于datasette
没有传递给那个钩子,我用这个可怕的堆栈检查解决了它:
@hookimpl def prepare_jinja2_environment (环境): # TODO: 理想情况下,这应该采用数据集,但这还不是一个论点 数据集=检查。当前帧()。 f_back 。 f_back 。 f_back 。 f_back 。 f_locals [ “自我” ]
将数据datasette
作为参数提供更好!
Database(is_mutable=)
现在默认为True
。 ( #1808 )
我在 datasette-upload-dbs 中遇到了一个错误,因为我错误地将额外的数据库添加到不可变模式下的 Datasette 接口中。此 API 更改使该错误更难犯。
- datasette.check_visibility()方法现在接受一个可选的
permissions=
列表,允许它在决定是否应将某些内容显示为公共或私有时一次考虑多个权限。这已用于在 Datasette 界面的更多位置正确显示挂锁图标。 ( #1829 )
受 Datasette Cloud 启发的另一项改进:我注意到挂锁图标在整个 Datasette 界面中没有正确显示,它们旨在指示数据库、表、视图或查询是私有的。
那是因为在决定某些东西是否私有时实际上涉及多个权限检查:用户可能在实例、数据库或表级别授予访问权限。
授予权限的代码正在检查所有这些,但随后检查匿名用户是否能够看到它的代码不是。我修复了这个问题,同时保持对check_visibility()
方法的旧用法的兼容性。
- Datasette 不再对其依赖项实施上限。 ( #1800 )
亨利施赖纳说服了我。另请参阅 Hynek Schlawack 的Semantic Versioning Will Not Save You 。
我仍然担心这个。
一方面,Datasette 可以用作库作为更大应用程序的一部分(参见最近的 Django TIL示例)。因此,固定要求是粗鲁的:它使下游用户更难升级他们的依赖关系。
但大多数时候 Datasette 是作为独立应用程序安装的—— pipx install datasette
或brew install datasette
。在这些情况下,我希望能够保证用户将获得每个依赖项的已知工作版本。
我仍然在这里考虑我的选择。我什至可以将作为库工作的 Datasette 的核心部分分解为单独的包,因此datasette
具有固定的依赖项,但库用户可以使用单独的包名称安装未固定的版本。
文档
我认为这部分没有解释。我喜欢使用发行说明来强调这类事情,包括可能不在核心 Datasette 文档本身中托管的文章。
- 新教程:使用 sqlite-utils 和 Datasette 清理数据。
- 文档中的屏幕截图现在使用shot-scraper维护,如使用 shot-scraper为 Datasette 文档自动化屏幕截图中所述。 ( #1844 )
- CLI 参考页面上的更详细的命令描述。 ( #1787 )
- 使用 OpenRC 运行 Datasette的新文档 – 感谢 Adam Simpson。 ( #1825 )。
原文: http://simonwillison.net/2022/Oct/27/datasette-0-63/#atom-everything