有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

MySQL 连接器介绍

MySQL 连接器提供了连接您自有的 MySQL 数据库,对接微搭开发的应用,以获取或操作数据库中的数据。



在使用 MySQL 连接器时,有两项配置需要进行操作:连接器配置及表达式编写。
连接配置:通过配置连接器,确定连接 MySQL 数据库的地址、方法、连接的数据库、认证等相关信息。
Query 表达式编写:通过编写表达式,可以使用 SQL 语句进行数据库操作。同时可以通过表达式与页面组件、代码实现联动。

连接配置说明

通过微搭编辑器的代码区,可以通过新建 MySQL 查询能力来新建表达式。在首次创建 MySQL 表达式时,如果没有 MySQL 连接配置,将会要求新建 MySQL 连接配置;新建连接配置将跳转至编辑器中的数据源 > 数据连接器面板进行。后续新建新的连接器,或编辑修改已有的连接器,均可以通过进入数据连接器面板,进行管理操作。



1. 连接配置用于告知微搭平台连接 MySQL 数据库的相关配置信息,在创建或修改连接配置时,有如下信息需要填写:
连接配置名称、标识:用于标明数据库连接配置的名称、唯一标识。
选择开发或发布阶段的配置:用于确定后续的数据库配置用于应用的开发预发版本,或是正式版本;开发、发布阶段配置的详细说明可见 连接器概述 中的连接器配置说明。
接入方式:MySQL 连接器支持通过公网对接第三方 MySQL,通过内网对接腾讯云 TDSQL-C MySQL版及 TencentDB MySQL。
主机及端口:当选择通过 IP/域名连接数据库时,需要填写 MySQL 数据的主机地址及连接端口,主机地址可以填写公网 IP 或域名。
数据库 ID:当选择连接腾讯云数据库时,可以通过填写对应的数据库实例 ID 确定所需连接的数据库。
数据库名:填写需要连接及使用的数据库。
用户名及密码:填写连接数据库所使用的用户名及密码认证信息。
SQL 预编译:默认开启状态,开启后,表达式中的 SQL 语句将预编译后执行。预编译可以极大的提高 SQL 执行时的安全性,避免 SQL 注入等风险。预编译详细说明可见 MySQL Prepared Statements。开启预编译后,SQL 语句中不可以在数据库名、表名等位置使用参数传递。如需动态表名、数据库名,可以通过关闭预编译的方式提供,同时也可以通过编写多个表达式并选择执行的方式达到同样目的。
注意:
关闭预编译后,可能带来SQL 注入的安全风险,请谨慎使用。
连接参数:用于设置与数据库建立连接时的可选参数配置。连接参数详细请参见 MySQL connection options
2. 在完成连接配置填写后,可以通过连接测试能力,验证连接配置的正确性。如测试失败,可以根据测试返回的 MySQL 报错,调整修正连接配置。
3. 完成测试后,可以单击保存,保存连接配置。如果是修改连接配置,在保存后,新的配置信息将生效,基于此连接配置的表达式,均将使用新的配置信息进行后续 SQL 的执行。
4. 如果后续需要修改连接配置,也可以通过下拉菜单选中配置,并通过单击修改,在打开的修改窗口中进行配置的修改调整。
说明:
通过域名或 IP 的方式,仅支持通过公网访问数据库;通过数据库 ID 对接腾讯云数据库,仅可以支持上海地区的 TDSQL-C MySQL 版及 TencentDB MySQL 数据库。

Query 表达式编写说明

通过微搭编辑器的代码区,可以通过新建 MySQL 查询能力来新建表达式。在完成 MySQL 连接配置后,就可以通过编写 SQL 语句实现表达式获取数据或操作数据的需求。



SQL 语句编写

SQL 语句根据实际业务需求进行编写即可。可以使用的包括 SELECTINSERTUPDATEDELETE 语句。当前在 MySQL 连接器的表达式中暂时不提供库表相关操作的支持,包括 CREATEDROPALTERTRUNCATE
SQL 语句示例如下:
SELECT * FROM users;
# 从指定表中查询数据;可通过修改'users'指定到所需操作的表,可通过修改 '*' 为指定获取字段;

INSERT INTO users (name, email, phone) VALUES ({{$w.form.inputname.value}}, {{$w.form.inputemail.value}}, {{$w.form.inputphone.value}})
# 向指定表中插入数据;可通过修改'users'指定到所需操作的表,可通过 {{参数}} 引用组件、变量数据;

UPDATE users SET email={{$w.form.modifyemail.value}}, phone={{$w.form.modifyphone.value}} WHERE id={{$w.selectuser.data.id}};
# 更新指定表中的数据;可通过修改'users'指定到所需操作的表,可通过 {{参数}} 引用组件、变量数据;

DELETE FROM user WHERE id={{$w.selectuser.data.id}};
# 删除指定表中的数据;可通过修改'users'指定到所需操作的表,可通过 {{参数}} 引用组件、变量数据;
在 SQL 语句的输入框中支持同时写入多条语句,使用 ; 进行语句间分隔即可。表达式的输出值,以最后一条执行的 SQL 语句为准。

参数获取

在 SQL 语句中,可以通过 {{ }} 的方式编写表达式,获取应用或页面的变量、组件值,用于 SQL 语句执行时的参数传递。 表达式的详细说明请参见 表达式介绍,如果需要获取组件、控件中的数据、属性,同样可以参见 获取组件属性值。 例如,在表达式中可以通过 {{"'%" + $w.input.value + "%'"}} 的方式实现拼接,达到使用 SQL 语句,通过用户输入,进行模糊查询的效果:SELECT * from userinfo where username like {{"'%" + $w.input.value + "%'"}}
特定系统参数获取:在表达式中,可以通过 SERVER 对象获取特定系统参数,系统参数不依赖前端参数传递。
目前保留在 SERVER 对象下有如下字段可使用:
SERVER.USERID:表示当前用户 USERID,与前端系统变量 $w.auth.currentUser.userId 取值一致。
SERVER.OPENID:表示小程序下当前登录用户的 OPENID,与前端系统变量 $w.auth.currentUser.openId 取值一致。



SQL语句执行说明

当在 SQL 语句中引入参数时,连接器的预编译配置开关,会对引入参数的使用方式带来不一样的效果。
开启预编译
SQL 语句的预编译,会由 MySQL 将语句在执行前预先进行编译,执行时使用编译后的语句加上传入的参数实际运行。通过预编译,可以防止 SQL 注入。在运行时的传入参数,仅允许 SQL 支持的参数,而不允许参数中带有 SQL 命令或关键字。
在开启预编译后,{{ }}包裹的表达式,仅允许出现在 SQL 语句中的参数位置,而不允许在表达式中有 SQL 语句相关的拼接。
同时,表达式的输出,需要可以匹配 SQL 参数,例如需要确认是字符串参数或时间日期参数、数值参数。
如下示例可以运行通过:
# 从输入组件中获取模糊匹配字符串
SELECT * from userinfo where username like {{"%"+$w.input1.value+"%"}}

# 判断输入组件是否填写,有填写的情况下进行模糊搜索,未填写的情况下全匹配
SELECT * from userinfo where username like {{$w.input1.value ? "%"+$w.input1.value+"%" , "%"}}

# 输出参数为时间日期参数
SELECT * from userinfo where created_at < {{ $w.date1.value? $w.DateText($w.date1.value,'YYYY-MM-DD'):"2099-1-1"}}
如下示例运行将失败或无效:
# where 语句中的 username like为字符串拼接,而不是 SQL 参数
SELECT * from userinfo where {{ " username like "+ "%" + $w.input1.value + "%" }}

# 未使用 {{}} 包裹变量以形成表达式
SELECT * from userinfo where created_at > $w.date1.value

# 输出参数为字符串类型,SQL参数无法匹配
SELECT * from userinfo where created_at > {{ "'"+$w.date1.value+"'" }}

# 预编译语句操作的表名、库名不允许使用参数,如果需要访问不同库,建议使用多个query,并通过前端逻辑调用不同query来获取数据。
SELECT * from {{$w.input1.value}}
关闭预编译
在关闭预编译后,SQL 语句将不会在执行前进行预编译,且此时的表达式和 SQL 语句将以字符串拼接的方式形成最终执行的 SQL 语句。关闭后可能带来的是SQL注入风险,请谨慎使用。
在关闭预编译后,使用字符串拼接的语句将可以使用。
关闭预编译的情况下,如下示例可以使用:
# 可以拼接 where 语句, 拼接语句中需要使用 ' 号标记字符串
SELECT * from userinfo {{ "where username like "+ "'%" + $w.input1.value + "%'" }}

# 输出参数拼接后可运行
SELECT * from userinfo where created_at > {{ "'"+$w.date1.value+"'" }}

# 可拼接表名
SELECT * from {{$w.input1.value}}
警告:
在这种情况下,如果未对输入值进行检查或处理,极有可能会留有 SQL 注入漏洞。

表达式返回值

SQL 语句执行完成以后,结果将以 JSON 的形式返回。返回值可以在表达式参数中获取。 在表达式执行后,可以通过表达式的 records 字段获取到 SQL 的执行返回内容。当查询语句时,records 字段内包含查询到的具体数据,当插入、更新、删除语句时,records 字段内包含 affectedRows 字段,用于标识执行操作的行数。
在前端应用、代码、控件中,可以通过 $w.queryname.records 的方式,获取到 Query 的执行内容,其中 queryname 根据具体创建 Query 时的名称来确定。
表达式的详细引用和使用方式请参见 Query 数据查询介绍

开发调试

在编辑器中完成 SQL 语句及表达式编写后,可以通过单击编辑器查看当前推算出来的、将会实际执行的 SQL 语句。如果在实际开发过程中碰到问题,可以将此推算出的 SQL 语句复制并通过数据库客户端或管理工具,测试运行以了解 SQL 语句运行的实际问题。



在开发编辑 SQL 时,也可以通过手工单击 query 的运行按钮,通过输出面板查看 SQL 语句运行输出的结果,结果可以通过表格形式或 JSON 形式查看。



另外在编辑 query 阶段,可以在编辑窗口右侧查看到当前连接的 MySQL 表的信息,可用于参考和协助 SQL 语句的编写。




使用示例

通过本示例,将提供数据库数据表准备、连接配置、表达式编写和控件对接的完整示例。

数据库数据表准备

1. 准备自有的 MySQL 数据库,准备好数据库的连接信息,认证信息,例如:
Host:gz-cdb-xxxxxxx.sql.tencentcdb.com
Port:63999
User:wedatest
Password:xxxxxx
2. 在数据库中创建 test 库,并使用如下接口创建表 userinfo
CREATE TABLE `userinfo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` text NOT NULL,
`password` text,
`email` text,
`phone` text,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
3. 表创建完成后,通过执行如下 SQL 语句,在表中预先准备一定的测试数据。
INSERT INTO `userinfo` (`username`, `email`, `phone`) VALUES ('user1', 'user1@qq.com', '18612345678');
INSERT INTO `userinfo` (`username`, `email`, `phone`) VALUES ('user2', 'user2@qq.com', '18612345679');
INSERT INTO `userinfo` (`username`, `email`, `phone`) VALUES ('user3', 'user3@qq.com', '18612345680');

应用创建

通过微搭控制台,创建自定义应用。

配置数据库连接,创建查询表达式

1. 在应用代码区,新建数据查询,选择新建 MySQL 查询,创建表达式名字为 query1。 如果弹出连接配置信息,根据数据库的连接信息配置连接,填写连接配置名,填写数据库的 HOST 地址、PORT 端口、数据库名 test、认证 User 用户名、Password 登录密码。



2. 配置完成后测试连接,确保测试通过后保存配置。
3. 编写如下 SQL 语句:
select * from userinfo
4. 保存表达式并测试运行,检查是否获取到数据库中已插入的数据,确保 SQL 运行正常。




对接应用控件,提供数据展示

1. 在应用中添加数据表格组件,编辑表格组件的表达式,填写为 $w.query1.data.records,其中 query1 为前面步骤创建的 MySQL 表达式名称。
2. 调整表格组件的列管理,确保包含了 idusernameemailphonecreated_atupdated_at 列。
3. 刷新编辑区页面,可以查看到当前表格中已有了数据库中的内容。




增加插入数据使用的控件,提供数据插入

1. 在页面上新增表单容器 form1,并在表单容器中新增3个单行输入,组件 ID 分别为 input1、input2、input3,分别用于用户名、手机、邮箱输入,根据情况配置好标题及数据校验规则。
2. 在表单容器中增加按钮,标题为新增,组件 ID 为 button1。

创建新增表达式

1. 在代码区再次新建 MySQL 查询,创建表达式名字为 query2,连接配置使用之前已经创建好的连接。
2. 编写如下 SQL 语句:
INSERT INTO userinfo (`username`, `email`, `phone`) VALUES ({{$w.input1.value}}, {{$w.input3.value}}, {{$w.input2.value}});
3. 触发方式选择为手动触发执行。




关联表达式与按钮控件

选择表单控件中的按钮,添加点击事件,选择调用数据查询,选择 Query 为新增表达式创建的 query2。



验证表达式执行

在页面的控件中填写具体插入用户信息,例如:“user4”,“1861234578”,“user4@qq.com”,并单击按钮,执行新增过程。执行完成后刷新页面,查看数据表格中是否已有新增的用户信息。