Datasette插件,用于插入和更新数据
项目描述
datasette-insert
Datasette插件,用于插入和更新数据
安装
在Datasette相同的环境中安装此插件。
$ pip install datasette-insert
此插件应始终与附加配置一起部署,以防止未经认证的访问,请参阅以下说明。
如果您在自己的本地机器上尝试它,您可以使用pip install
安装datasette-insert-unsafe插件,以允许无需单独设置身份验证或权限即可访问。
插入数据和创建表
启动datasette并确保它附有可写的SQLite数据库。如果您尚未创建数据库文件,您可以使用此
datasette data.db --create
--create
选项将在数据库文件不存在时创建一个新的空data.db
数据库文件。
该插件添加了一个端点,允许通过向以下URL发送JSON数据来插入或更新数据以及创建表
/-/insert/name-of-database/name-of-table
JSON应如下所示
[
{
"id": 1,
"name": "Cleopaws",
"age": 5
},
{
"id": 2,
"name": "Pancakes",
"age": 5
}
]
首次将数据发布到该URL时,如果该名称的表不存在,则会创建一个具有所需列的新表。
您可以使用?pk=
URL参数指定哪个列应作为主键使用。
以下是使用Python requests
库将数据发布到数据库并创建新表的示例
import requests
requests.post("http://localhost:8001/-/insert/data/dogs?pk=id", json=[
{
"id": 1,
"name": "Cleopaws",
"age": 5
},
{
"id": 2,
"name": "Pancakes",
"age": 4
}
])
以下是使用curl
执行相同操作的示例
curl --request POST \
--data '[
{
"id": 1,
"name": "Cleopaws",
"age": 5
},
{
"id": 2,
"name": "Pancakes",
"age": 4
}
]' \
'http://localhost:8001/-/insert/data/dogs?pk=id'
或者通过管道输入JSON,如下所示
cat dogs.json | curl --request POST -d @- \
'http://localhost:8001/-/insert/data/dogs?pk=id'
插入单行
如果您正在插入单行,您可以可选地将其作为字典发送,而不是作为包含单个项目的列表
curl --request POST \
--data '{
"id": 1,
"name": "Cleopaws",
"age": 5
}' \
'http://localhost:8001/-/insert/data/dogs?pk=id'
自动添加新列
如果您向现有表发送数据,其键与现有列不对应,您将收到一个带有如下JSON响应的HTTP 400错误
{
"status": 400,
"error": "Unknown keys: 'foo'",
"error_code": "unknown_keys"
}
如果您将?alter=1
添加到您要发送的URL中,任何缺失的列将被自动添加
curl --request POST \
--data '[
{
"id": 3,
"name": "Boris",
"age": 1,
"breed": "Husky"
}
]' \
'http://localhost:8001/-/insert/data/dogs?alter=1'
更新数据
“upsert”操作可以用来部分更新一条记录。使用upserts,您可以发送一组键的子集,如果ID与指定的主键匹配,则将用于更新现有记录。
可以将upserts发送到/-/upsert
API端点。
以下示例将更新ID为1的狗的年龄从5岁改为7岁。
curl --request POST \
--data '{
"id": 1,
"age": 7
}' \
'http://localhost:3322/-/upsert/data/dogs?pk=id'
与/-/insert
端点类似,/-/upsert
端点也可以接受对象数组。它还支持?alter=1
选项。
权限和身份验证
此插件默认拒绝所有访问,以确保人们不会意外地在不安全的配置下将其部署到公网上。
您可以在Datasette手册中阅读有关Datasette身份验证方法的说明。
您可以通过安装datasette-insert-unsafe
插件以不安全模式运行,默认允许所有访问。
我建议您与datasette-auth-tokens插件一起使用,该插件提供了一种使用API令牌进行身份验证调用的机制。
然后,您可以在datasette-insert
插件配置中使用“allow”块来指定哪些经过身份验证的令牌允许使用API。
以下是一个示例metadata.json
文件,它将/-/insert
API的访问权限限制为在INSERT_TOKEN
环境变量中定义的API令牌。
{
"plugins": {
"datasette-insert": {
"allow": {
"bot": "insert-bot"
}
},
"datasette-auth-tokens": {
"tokens": [
{
"token": {
"$env": "INSERT_TOKEN"
},
"actor": {
"bot": "insert-bot"
}
}
]
}
}
}
配置完成后,您可以像这样启动Datasette:
INSERT_TOKEN=abc123 datasette data.db -m metadata.json
现在,您可以使用curl
像这样向API发送数据:
curl --request POST \
-H "Authorization: Bearer abc123" \
--data '[
{
"id": 3,
"name": "Boris",
"age": 1,
"breed": "Husky"
}
]' \
'http://localhost:8001/-/insert/data/dogs'
或者使用Python的requests
库,如下所示:
requests.post(
"http://localhost:8001/-/insert/data/dogs",
json={"id": 1, "name": "Cleopaws", "age": 5},
headers={"Authorization": "bearer abc123"},
)
细粒度权限
如上所述使用“allow”块授予API启用功能的完全权限。
API实现了多个新的Datasett权限,其他插件可以使用这些权限进行更细粒度的决策。
权限的完整集合如下:
insert:all
- 所有权限 - 如上所述的“allow”块所使用。参数:database_name
insert:insert-update
- 向现有表插入数据或通过主键更新数据的能力。参数:(database_name, table_name)
insert:create-table
- 创建新表的能力。参数:database_name
insert:alter-table
- 向现有表添加列的能力(使用?alter=1
)。参数:(database_name, table_name)
您可以使用像datasette-permissions-sql这样的插件来挂钩这些更详细的权限,以便对每个经过身份验证的行为者可以采取的操作进行精细控制。
实现permission_allowed()插件钩子的插件可以完全控制这些权限决策。
CORS
如果您使用datasette --cors
选项启动Datasette,以下HTTP头将被添加到此插件提供的资源:
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: content-type,authorization
Access-Control-Allow-Methods: POST
开发
要本地设置此插件,首先检出代码。然后创建一个新的虚拟环境
cd datasette-insert
python3 -m venv venv
source venv/bin/activate
现在安装依赖项和测试
pip install -e '.[test]'
要运行测试
pytest
项目详细信息
datasette-insert-0.8.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a6c53304f517f403729454d9673a1b4c30c0eea8a590a04cc3f28e3f7bf2f180 |
|
MD5 | 352d67a581df2a0308b9dd6d5f30affd |
|
BLAKE2b-256 | c31836d812ff3cb298c8a081c1b780b6f39b0995cc25ae06430af86adf0aaeb0 |
datasette_insert-0.8-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 66945451d5671a2e66dc9f27519ce44516dab23a18f944deb6d3ada11710ebe3 |
|
MD5 | be3f31a08a76588f5a2e6b2f6652eae9 |
|
BLAKE2b-256 | af150253bb3ea69f2e04897e0b02cd96c2ac23cd0be73b61b5a0c41b8f42a633 |