alchemy-utils 0.1a0
alchemy-utils 0.1a0
alchemy-utils 0.1a0 发布,这是一个与数据库无关的 Python 库和 CLI 工具,基于 SQLAlchemy 实现 sqlite-utils 核心 API(insert、upsert、insert_all、upsert_all、create、update 及表内省),支持 PostgreSQL、SQLite 和 duckdb。项目由 Codex 和 GPT-5.6 Sol Ultra 构建,采用红绿 TDD 和 pytest 测试。示例命令可列出 PostgreSQL 表行或向 DuckDB 插入 CSV 数据,后者经优化后运行时间从近一小时降至约 35 秒。
发布:alchemy-utils 0.1a0
我长期以来一直在思考,我的 sqlite-utils Python 库和 CLI 工具如果做成一个与数据库无关的版本会是什么样子。今天早上(literally 一个淋浴时的项目),我让 Codex 和 GPT-5.6 Sol Ultra 构建一个原型:
- 做一次研究性 spike,看看构建一个与 SQLite-utils 核心 API 相同的库需要什么——特别是 insert、upsert、insert_all、upsert_all、create 和 update 方法,以及表内省功能——但底层用 SQLalchemy 支持,这样它就能适用于多种数据库引擎
- 针对 PostgreSQL、SQLite 和 duckdb 进行测试
- 参考 ~/dev/sqlite-utils
- 为此创建一个 git 仓库,并尽早且频繁地提交——使用 uv init 启动项目——采用红/绿 TDD 和 pytest,关于 PostgreSQL 测试如何工作,可参考 ~/dev/django-sql-dashboard 中的一个思路
只用了很少的后续提示,这个项目就达到了可以发布 alpha 版本的状态。这里有一行命令,我可以用来列出本地 PostgreSQL 中博客数据库表里的行:
uvx --with 'alchemy-utils[postgresql]' alchemy-utils rows 'postgresql+psycopg://simon@localhost:5432/simonwillisonblog' redirects_redirect
输出开头如下:
[
{
"id": 2328,
"domain": "simonwillison.net",
"path": "2020/May/21/apple-photos-sqlite/",
"target": "/2020/May/21/dogsheep-photos/",
"created": "2020-05-21T13:03:46.591692-07:00"
},
{
"id": 3,
"domain": "feeds.simonwillison.net",
"path": "swn-links",
"target": "https://simonwillison.net/atom/links/",
"created": "2017-10-01T14:12:54.820729-07:00"
}
]
或者,如果你想要一个包含旧金山每棵树的 DuckDB 数据库,schema 会自动根据文件创建:
curl 'https://raw.githubusercontent.com/simonw/sf-tree-history/refs/heads/main/Street_Tree_List.csv' | uvx --with 'alchemy-utils[duckdb]' alchemy-utils insert 'duckdb:////tmp/trees.db' trees - --csv
(第一次运行这个命令花了将近一个小时,所以我让 Codex 优化了一下,把它降到了大约 35 秒。)
标签:databases、postgresql、projects、python、sql、sqlalchemy、sqlite、sqlite-utils、duckdb、coding-agents、codex