有奖捉虫:行业应用 & 管理与支持文档专题 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”,并单击按钮,执行新增过程。执行完成后刷新页面,查看数据表格中是否已有新增的用户信息。


http://www.vxiaotou.com