跳转到主要内容

Datasette插件,用于插入和更新数据

项目描述

datasette-insert

PyPI Changelog License

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 (5.5 kB 查看哈希值)

上传时间 源代码

构建版本

datasette_insert-0.8-py3-none-any.whl (5.7 kB 查看哈希值)

上传时间 Python 3

由以下提供支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面