MySQL & MariaDB 绑定规范

关于 MySQL 绑定组件的详细文档

组件格式

MySQL 绑定支持连接 MySQL 和 MariaDB 数据库。在本文档中,“MySQL” 用于指代这两个数据库。

要设置 MySQL 绑定,请创建一个类型为 bindings.mysql 的组件。请参阅本指南了解如何创建和应用绑定配置。

MySQL 绑定使用 Go-MySQL-Driver 作为内部驱动。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: <NAME>
spec:
  type: bindings.mysql
  version: v1
  metadata:
    - name: url # 必需,定义数据库连接的 DSN 格式
      value: "<CONNECTION_STRING>"
    - name: pemPath # 可选
      value: "<PEM PATH>"
    - name: maxIdleConns
      value: "<MAX_IDLE_CONNECTIONS>"
    - name: maxOpenConns
      value: "<MAX_OPEN_CONNECTIONS>"
    - name: connMaxLifetime
      value: "<CONNECTION_MAX_LIFE_TIME>"
    - name: connMaxIdleTime
      value: "<CONNECTION_MAX_IDLE_TIME>"

规范元数据字段

字段 必需 绑定支持 详情 示例
url Y 输出 以数据源名称 (DSN) 格式表示数据库连接。查看 此处 的 SSL 详情 "user:password@tcp(localhost:3306)/dbname"
pemPath Y 输出 PEM 文件的路径。用于 SSL 连接 "path/to/pem/file"
maxIdleConns N 输出 最大空闲连接数。大于 0 的整数 "10"
maxOpenConns N 输出 最大打开连接数。大于 0 的整数 "10"
connMaxLifetime N 输出 最大连接生命周期。格式为持续时间字符串,例如 "12s" "12s"
connMaxIdleTime N 输出 最大连接空闲时间。格式为持续时间字符串,例如 "12s" "12s"

SSL 连接

如果您的服务器需要 SSL,您的连接字符串必须以 &tls=custom 结尾,例如:

"<user>:<password>@tcp(<server>:3306)/<database>?allowNativePasswords=true&tls=custom"

您必须将 <PEM PATH> 替换为 PEM 文件的完整路径。如果您使用的是 Azure Database for MySQL,请参阅 Azure 关于 SSL 数据库连接的文档,了解如何下载所需的证书。连接到 MySQL 需要最低 TLS 版本为 1.2。

多语句

默认情况下,MySQL Go 驱动 仅支持每个查询/命令一个 SQL 语句。

要在一个查询中允许多个语句,您需要在查询字符串中添加 multiStatements=true,例如:

"<user>:<password>@tcp(<server>:3306)/<database>?multiStatements=true"

虽然这允许批量查询,但也大大增加了 SQL 注入的风险。仅返回第一个查询的结果,所有其他结果将被静默丢弃。

绑定支持

此组件支持具有以下操作的输出绑定

  • exec
  • query
  • close

参数化查询

此绑定支持参数化查询,允许将 SQL 查询本身与用户提供的值分开。强烈建议使用参数化查询以提高安全性,因为它们可以防止 SQL 注入攻击

例如:

-- ❌ 错误!在查询中包含值,容易受到 SQL 注入攻击。
SELECT * FROM mytable WHERE user_key = 'something';

-- ✅ 好!使用参数化查询。
-- 这将使用参数 ["something"] 执行
SELECT * FROM mytable WHERE user_key = ?;

exec

exec 操作可用于 DDL 操作(如表创建),以及返回仅元数据的 INSERTUPDATEDELETE 操作(例如受影响的行数)。

params 属性是一个包含 JSON 编码参数数组的字符串。

请求

{
  "operation": "exec",
  "metadata": {
    "sql": "INSERT INTO foo (id, c1, ts) VALUES (?, ?, ?)",
    "params": "[1, \"demo\", \"2020-09-24T11:45:05Z07:00\"]"
  }
}

响应

{
  "metadata": {
    "operation": "exec",
    "duration": "294µs",
    "start-time": "2020-09-24T11:13:46.405097Z",
    "end-time": "2020-09-24T11:13:46.414519Z",
    "rows-affected": "1",
    "sql": "INSERT INTO foo (id, c1, ts) VALUES (?, ?, ?)"
  }
}

query

query 操作用于 SELECT 语句,返回元数据以及以行值数组形式的数据。

params 属性是一个包含 JSON 编码参数数组的字符串。

请求

{
  "operation": "query",
  "metadata": {
    "sql": "SELECT * FROM foo WHERE id < $1",
    "params": "[3]"
  }
}

响应

{
  "metadata": {
    "operation": "query",
    "duration": "432µs",
    "start-time": "2020-09-24T11:13:46.405097Z",
    "end-time": "2020-09-24T11:13:46.420566Z",
    "sql": "SELECT * FROM foo WHERE id < ?"
  },
  "data": [
    {column_name: value, column_name: value, ...},
    {column_name: value, column_name: value, ...},
    {column_name: value, column_name: value, ...},
  ]
}

这里的 column_name 是查询返回的列名,value 是该列的值。请注意,值以字符串或数字(语言特定的数据类型)返回。

close

close 操作可用于显式关闭数据库连接并将其返回到池中。此操作没有任何响应。

请求

{
  "operation": "close"
}

相关链接