大家好,我是木木。
今天给大家分享一个开放的 Python 库,datasette。
datasette
datasette 是一个把 SQLite 数据库发布成可浏览网站和 JSON API 的工具。它特别适合数据新闻、开放数据、科研数据集、内部小型数据目录这类场景:数据本身放在 SQLite 里,Datasette 负责提供表格浏览、SQL 查询、API 输出和元数据展示。它不是一个重型 BI 平台,更像一个轻巧的数据发布层,能让数据从文件快速变成可访问的服务。
项目地址:https://github.com/simonw/datasette
官方文档:https://docs.datasette.io/
三大特点
开箱即用
给它一个 SQLite 文件,就能得到网页浏览界面和 JSON API。
面向发布
适合把静态数据、开放数据和研究数据发布出去,而不是只在本地脚本里查看。
插件生态
认证、导入、导出、可视化、部署等能力可以通过插件继续扩展。
最佳实践
安装方式:pip install datasette。
第一段代码解决的问题是:把一个 SQLite 表通过 Datasette 的测试客户端访问成 JSON。正式使用时通常会运行 datasette serve data.db,这里为了截图稳定,直接在进程内创建 Datasette 实例。
importasyncio,sqlite3,tempfilefrompathlibimportPathfromdatasette.appimportDatasettefromimportlib.metadataimportversionasyncdefmain():path=Path(tempfile.gettempdir())/"datasette_demo.db"ifpath.exists():path.unlink()conn=sqlite3.connect(path)conn.execute("create table books (title text, year integer)")conn.executemany("insert into books values (?, ?)",[("SQLite",2000),("Datasette",2017)])conn.commit();conn.close()ds=Datasette([str(path)])response=awaitds.client.get("/datasette_demo/books.json?_shape=array")print("package:",version("datasette"))print("status:",response.status_code)print("rows:",response.json())asyncio.run(main())
第二段代码解决的问题是:通过 Datasette 管理的数据库对象执行 SQL,并拿到字典形式的结果。这适合在插件、自动化脚本或测试里复用 Datasette 的数据库上下文。
importasyncio,sqlite3,tempfilefrompathlibimportPathfromdatasette.appimportDatasetteasyncdefmain():path=Path(tempfile.gettempdir())/"datasette_demo_sql.db"ifpath.exists():path.unlink()conn=sqlite3.connect(path)conn.execute("create table sales (city text, amount integer)")conn.executemany("insert into sales values (?, ?)",[("Paris",10),("Berlin",20),("Paris",30)])conn.commit();conn.close()ds=Datasette([str(path)])result=awaitds.get_database("datasette_demo_sql").execute("select city, sum(amount) as total from sales group by city order by city")rows=[dict(zip(result.columns,row))forrowinresult.rows]print("query rows:",rows)asyncio.run(main())
环境与版本信息
本文示例使用 Python 3.11.0、datasette 0.65.2。示例只创建本地临时 SQLite 文件,不启动公网服务,也不依赖外部数据库。
高级功能
进阶一点看元数据。Datasette 不只是把表暴露出来,还可以为实例、数据库和表配置标题、描述、来源、许可信息等,让发布的数据更容易被理解和引用。
fromdatasette.appimportDatasetteds=Datasette(memory=True,metadata={"title":"Library Demo","description":"SQLite data as API"})print("title:",ds.metadata("title"))print("description:",ds.metadata("description"))print("databases:",sorted(ds.databases.keys()))
适用场景
适合开放数据门户、小型内部数据浏览器、CSV/SQLite 数据集发布、数据新闻项目、可复现研究数据展示,以及需要“网页 + API”双形态访问的轻量数据服务。
不适用场景
不适合高并发事务系统、复杂权限模型的企业 BI、强实时写入场景,或需要大量交互式建模和仪表盘编排的分析平台。
上线检查
- 确认 SQLite 文件路径、只读/可写模式和备份策略。2. 给数据配置清晰的标题、来源、许可和更新时间。3. 如果开放到公网,提前设置认证、限流和 SQL 查询权限。4. 对大表准备索引,避免浏览和筛选时拖慢服务。
总结
datasette 的魅力在于简单直接:把 SQLite 数据变成别人能浏览、能查询、能通过 API 读取的东西。对很多“数据已经有了,只差一个可访问入口”的场景,它非常顺手。