• 关于

    触发器语法

    的搜索结果

回答

触发器 目的往往bai是为了保证du数据的一致性,所以在服务器zhi端dao设置触发器,一旦用户zhuan 修改 删除,或者添加了shu某一个 字段的数据,然后设置好的触发器自动执行另一个 修改 删除 或者添加操作,以保证数据的关联性 或者一致性。 你的触发器内容为 一个 简单的 select 查询,个人认为好像没有意义。 另外错误提示是 语法问题。你可以再仔细检查下。
游客2q7uranxketok 2021-02-20 00:19:38 0 浏览量 回答数 0

问题

使用jdbc创建MySQL的trigger出现错误

用jdbc来创建一个MySQL触发器,自己在navicat里面实验可以成功,但是程序跑起来就会提示创建触发器的语句有语法错误。...
蛮大人123 2019-12-01 19:49:57 852 浏览量 回答数 1

问题

使用jdbc创建MySQL的trigger出现错误

如下所示,我用jdbc来创建一个MySQL触发器,自己在navicat里面实验可以成功,但是程序跑起来就会提示创建触发器的语句有语法错误。求指教...
蛮大人123 2019-12-01 20:00:58 773 浏览量 回答数 2

问题

我的MySQL触发器不起作用,语法简单,不复杂?mysql

我不知道为什么我的触发器不起作用,当我手动使用它时查询有效,但是当我想由触发器更新时它不起作用。有人可以帮我知道为什么吗? 这是我的触发器: CREATE TRIGGER `...
保持可爱mmm 2020-05-17 20:35:12 2 浏览量 回答数 1

问题

我可以在MySQL触发器的if语句中声明游标吗?

IF ((SELECT COUNT(*) FROM Votes v) <= 3) THEN DECLARE VoteCursor CURSOR FOR SELECT v.VoteType ...
保持可爱mmm 2019-12-01 21:57:51 2 浏览量 回答数 0

回答

您想要一个instead of触发器。对于SQL Server,您的语法看起来非常错误。您不是在指inserted。 它应该看起来像: CREATE TRIGGER CHANGEEVEN ON ANIMAL INSTEAD OF INSERT AS BEGIN INSERT INTO ANIMAL (LISTPRICE, . . . ) -- list columns here SELECT (CASE WHEN LISTPRICE % 2 = 1 THEN LISTPRICE + 1 ELSE LISTPRICE END), . . . -- rest of columns here FROM inserted i; END;
祖安文状元 2020-01-05 14:46:29 0 浏览量 回答数 0

回答

首先react通过介绍新的声明式语法JSX来重新定义视图开发,优点其实官网就有,不过我可以简单说两句:第一,学会了react以及这个JSX语法,你不光可以通过react写web;也可以通过react-native写ios或者android的应用;甚至可以通过react-blessed写terminal可视化应用;当然也可以通过react-native-desktop写桌面应用。因为JSX这种声明式语法实际是在构建一个抽象的视图层,这种抽象可以通过不同适配器适配到各种显示终端,这总够屌吧?第二,说回到web版的react,她有virtual dom,这个东西的好处是减少DOM操作,减少DOM操作的目的是提高浏览器的渲染性能,这听起来也够屌吧?第三,她倡导使用flux模式来进行组件间数据传输,这种做法叫unidirectional data flow(单向数据流),单向数据流的好处是与之前angularJS提出的two-way data binding相比较而言,因为单向,所以各种变化都是可预计、可控制的。不像two-way data binding那样,变化一但复杂起来,大家都互相触发变化,到最后一个地方变了,你根本猜不出来她还会导致其他什么地方跟着一起变。这个需要大量实践才能有所感受,如果你初学,那听听就算了,不必死磕。第四,她倡导使用immutable object(不可变数据),不可变的好处是大大节约了脏检查的消耗,有兴趣可以看我翻译的[译]JavaScript中的不可变性(Immutability)可能还有其他,不过我现在能想到就这些吧,是否符合你自己预期,自己多实践,有了心得之后再来回顾这些好处更有价值
a123456678 2019-12-02 02:06:13 0 浏览量 回答数 0

问题

全局事务服务 GTS SQL部分功能有什么?

GTS 事务目前支持 INSERT、UPDATE、DELETE 三类 DML 语法的部分功能,不支持 SQL 嵌套;不支持多表复杂 SQL;不支持存储过程、触发器;不支持批量 SQL。...
猫饭先生 2019-12-01 21:24:57 999 浏览量 回答数 0

回答

Doctype可声明三种DTD类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。   由于历史的原因,浏览器对页面的渲染方式是不一样的。在W3C标准出来之前,浏览器对页面的渲染没有同一的标准,产生了差异,quirks mod(混杂模式或者兼容模式),但在W3C标准出台之后,浏览器对页面的渲染有了同一的标准即(严格模式或标准模式)。但是为了保证以前就得页面仍然正常显示,有的浏览器就保存了这两种渲染模式(标准兼容模式)。那么究竟采用哪一种方式进行渲染,就要看DOCTYPE生命中的DTD。   1、文档类型定义(DTD)Document Type Definition   是一套为了进行程序间的数据交换而建立的关于标记符的语法规则。   可通过比较文档和文档类型定义文件来检查文档是否符合规范,元素和标签使用是否正确。 2、两种呈现模式:标准模式和混杂模式   在标准模式中,浏览器以其支持的最高标准呈现页面;   在混杂模式中,页面以一种比较宽松的向后兼容(兼容老的版本)的方式显示。混杂模式通常模拟老式浏览器的行为以防止老站点无法工作。 3、模式触发   浏览器根据DOCTYPE是否存在以及使用的哪种DTD来选择要使用的呈现方法。    如果XHTML、HTML 4.01文档包含形式完整的DOCTYPE,那么它一般以标准模式呈现。   包含过渡DTD和URI的DOCTYPE也导致页面以标准模式呈现,但是有过渡DTD而没有URI会导致页面以混杂模式呈现。   DOCTYPE不存在或形式不正确会导致HTML和XHTML文档以混杂模式呈现。 html5既然没有DTD,也就没有严格模式与宽松模式的区别,html5有相对宽松的语法,事实上,已经尽可能大的实现了向后兼容。
一只刺猬 2020-03-30 23:11:30 0 浏览量 回答数 0

问题

导致INSERT失败的TRIGGER?可能??mysql

在清理这个答案时,我TRIGGER对MySQL和s和存储过程有了一些了解,但感到震惊的是,尽管BEFORE INSERTand BEFORE UPDATE触发器可以修改数据,但它们似乎...
保持可爱mmm 2020-05-17 14:03:58 1 浏览量 回答数 1

回答

丢人了,今天被大妈整出俩 bug ,@tsl0922 正在找原因解决 BTW:在 @tsl0922 的 Linux 机器上居然没问题。 ###### 没关系,俺是非著名的 z-trunk-killer 经常将稳定系统用出问题来,,, 而且多数是同俺的奇怪非主流行为相关的,多数情况无法触发的,辛苦了,,, ###### 已经测试,没发现什么问题。可能是你写的Markdown文本语法不对? 看了你刚发的博客,生成的HTML格式基本正确。只有“华丽分割线”那里没有换行,请检查下“华丽分割线”那一行的行尾是不是有2个以上的空格,这样才可以换行。 详细的语法参考:http://www.oschina.net/question/100267_75314 ######回复 @红薯 : 要空格的,我测试了几个支持Markdown的网站都是要加空格的,包括Github,Stackoverflow在内######我刚才自己测试的文本加粗,没有空格也是不行,加了空格就好使了###### 嚓! 测试了一下,果然! - 应该是 md 语法有问题,就不解析? - 但是,强行发布时,又可以解析部分! 这说明使用的两种md 解析器不兼容?! 俺想说,如果是俺的格式问题,也应该在预览时,有提示哪?! 任何一种 markdown 解析器,对语法错误都有输出的哪,简单的收集高亮在外部,给俺个提示也是好的,,, 类似的输出我们是很习惯的,,, /Users/zoomq/Works/chromium2kn/lb-crx.github/doc4crx_zh/source/5-more/intro.rst:: WARNING: document isn't included in any toctree /Users/zoomq/Works/chromium2kn/lb-crx.github/doc4crx_zh/source/5-more/lb4crx/intro.rst:: WARNING: document isn't included in any toctree /Users/zoomq/Works/chromium2kn/lb-crx.github/doc4crx_zh/source/5-more/webstore/intro.rst:: WARNING: document isn't included in any toctree /Users/zoomq/Works/chromium2kn/lb-crx.github/doc4crx_zh/source/HelloThere.rst:: WARNING: document isn't included in any toctree /Users/zoomq/Works/chromium2kn/lb-crx.github/doc4crx_zh/source/INTRODUCE.rst:: WARNING: document isn't included in any toctree /Users/zoomq/Works/chromium2kn/lb-crx.github/doc4crx_zh/source/LINKS.rst:: WARNING: document isn't included in any toctree done preparing documents... done writing output... [100%] index ######页面上预览是在客户端使用JS解析的,发布后显示文章是服务器端Java解析的,可能会有一些差别吧。但只要是Markdown的标准语法,两者结果应该不会有太大出入的。
kun坤 2020-06-05 13:13:58 0 浏览量 回答数 0

回答

本文档介绍如何创建自定义授权策略。下面以授予子账号查询、扩容和删除集群的权限为例进行说明。 前提条件 在创建自定义授权策略时,您需要了解授权策略语言的基本结构和语法,相关内容的详细描述请参考授权策略语言描述。 背景信息 容器服务提供的系统授权策略的授权粒度比较粗,如果这种粗粒度授权策略不能满足您的需要,那么您可以创建自定义授权策略。例如,您想控制对某个具体的集群的操作权限,您必须使用自定义授权策略才能满足这种细粒度要求。 操作步骤 使用具有 RAM 权限的账号登录RAM 管理控制台。 单击左侧导航栏的权限管理 > 权限策略管理,进入权限策略管理页面。 单击新建授权策略,进入新建自定义权限策略页面。 填写策略名称,配置模式选择脚本配置,并在策略内容中编写您的授权策略内容。 自定义权限策略 { "Statement": [{ "Action": [ "cs:Get*", "cs:ScaleCluster", "cs:DeleteCluster" ], "Effect": "Allow", "Resource": [ "acs:cs:::cluster/集群ID" ] }], "Version": "1" } 其中: Action 处填写您所要授予的权限。 说明 所有的 Action 均支持通配符。 Resource 有如下配置方式。 授予单集群权限 "Resource": [ "acs:cs:::cluster/集群ID" ] 授予多个集群权限 "Resource": [ "acs:cs:::cluster/集群ID", "acs:cs:::cluster/集群ID" ] 授予所有集群的权限 "Resource": [ "*" ] 其中,集群ID 需要替换为您要授权的真实的集群 ID。 编写完毕后,单击确定。 返回权限策略管理页面,在搜索框中搜索策略名或备注,可以看到您授权的自定义的策略。权限策略管理 相关参考 表 1. 容器服务 RAM Action Action 说明 CreateCluster 创建集群 AttachInstances 向集群中添加已有 ECS 实例 ScaleCluster 扩容集群 GetClusters 查看集群列表 GetClusterById 查看集群详情 ModifyClusterName 修改集群名称 DeleteCluster 删除集群 UpgradeClusterAgent 升级集群 Agent GetClusterLogs 查看集群的操作日志 GetClusterEndpoint 查看集群接入点地址 GetClusterCerts 下载集群证书 RevokeClusterCerts 吊销集群证书 BindSLB 为集群绑定负载均衡实例 UnBindSLB 为集群解绑负载均衡实例 ReBindSecurityGroup 为集群重新绑定安全组 CheckSecurityGroup 检测集群现有的安全组规则 FixSecurityGroup 修复集群的安全组规则 ResetClusterNode 重置集群中的节点 DeleteClusterNode 移除集群中的节点 GetClusterProjects 查看集群下的应用 CreateTriggerHook 为应用创建触发器 GetTriggerHook 查看应用的触发器列表 RevokeTriggerHook 删除应用的触发器 CreateClusterToken 创建 Token UpdateClusterTags 编辑集群标签
1934890530796658 2020-03-26 11:43:07 0 浏览量 回答数 0

问题

在MySQL中循环结果集?mysql

我正在尝试在MySQL中编写一个存储过程,该存储过程将执行一个稍微简单的选择查询,然后循环遍历结果,以便决定是执行其他查询,数据转换还是完全丢弃数据。有效地,我想实现这一...
保持可爱mmm 2020-05-17 13:34:01 2 浏览量 回答数 1

问题

Swarm 集群 授权管理 创建自定义授权策略

容器服务提供的系统授权策略的授权粒度比较粗,如果这种粗粒度授权策略不能满足您的需要,那么您可以创建自定义授权策略。比如,您想控制对某个具体的集群的操作权限,您必须使用自定义授权策略才能...
青蛙跳 2019-12-01 21:33:17 723 浏览量 回答数 0

问题

Swarm mode 集群怎么使用配置项实现多套环境

应用分为代码和配置两个部分,当应用容器化之后,通常通过容器环境变量的方式传递配置,从而实现同一个镜像使用不同的配置部署多套应用。 swarm mode 模式支持 Compose V1/V2 和 ...
反向一觉 2019-12-01 21:22:13 1701 浏览量 回答数 0

回答

;在定义函数,存储过程和触发器(其中必须定义多个语句)时,通常使用默认值以外的分隔符 。您可以定义一个不同的定界符,例如$$,该定界符用于定义整个过程的结尾,但是在其中,每个单独的语句均以终止;。这样,当代码在mysql客户端中运行时,客户端可以知道整个过程的结束位置,并将其作为一个单元执行,而不是在其中执行各个语句。 请注意,DELIMITER关键字仅是命令行mysql客户端(和某些其他客户端)的功能,而不是常规的MySQL语言功能。如果您尝试将其通过编程语言API传递给MySQL,它将无法正常工作。其他一些客户端(如PHPMyAdmin)具有其他方法来指定非默认定界符。 例: DELIMITER $$ /* This is a complete statement, not part of the procedure, so use the custom delimiter $$ */ DROP PROCEDURE my_procedure$$ /* Now start the procedure code / CREATE PROCEDURE my_procedure () BEGIN / Inside the procedure, individual statements terminate with ; */ CREATE TABLE tablea ( col1 INT, col2 INT ); INSERT INTO tablea SELECT * FROM table1; CREATE TABLE tableb ( col1 INT, col2 INT ); INSERT INTO tableb SELECT * FROM table2; /* whole procedure ends with the custom delimiter */ END$$ /* Finally, reset the delimiter to the default ; */ DELIMITER ; 尝试DELIMITER与不支持它的客户端一起使用将导致将其发送到服务器,服务器将报告语法错误。例如,使用PHP和MySQLi: $mysqli = new mysqli('localhost', 'user', 'pass', 'test'); $result = $mysqli->query('DELIMITER $$'); echo $mysqli->error; 错误: 您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以在第1行的'DELIMITER $$'附近使用正确的语法
保持可爱mmm 2020-05-10 18:20:24 0 浏览量 回答数 0

问题

Kubernetes 集群&nbsp;&nbsp;授权管理 创建自定义授权策略

容器服务提供的系统授权策略的授权粒度比较粗,如果这种粗粒度授权策略不能满足您的需要,那么您可以创建自定义授权策略。比如,您想控制对某个具体的集群的操作权限,您必须使用自定义授权策略才能...
青蛙跳 2019-12-01 21:32:42 508 浏览量 回答数 0

问题

数据传输服务DTS中的名词解释有哪些

预检查 预检查是迁移任务启动之前的必经阶段,主要是对影响迁移成功的前置条件进行检查。例如源目标实例的连通性,迁移账号的权限等的检查。如果预检查失败了,那么可以根据修复方法修复后,重...
云栖大讲堂 2019-12-01 21:24:02 952 浏览量 回答数 0

回答

http://my.oschina.net/u/1986061/blog/380334 参考:http://stackoverflow.com/questions/4107028/create-a-oracle-db-trigger-using-thin-jdbc-driver我的实现方法 要分开执行 第一次执行delimiter$$ 第二次创建trigger 首先感谢@_Yud的回复,按照您的说法,我试了,单独执行delimiter$$通不过。 我准备尝试另一种方案:用bat来执行sql文件,这个已经验证通过,再用java来运行bat; 目前的主要难点,是每台机器上的数据库安装路径不清楚,bat文件要想连接到数据库,需要放在合适的文件夹路径下。不执行delimiter,直接开始创建trigger,使用executeUpdate方法执行,网上是这么说的 我使用jdbcTemplate试过,如果直接把trigger语句直接是可以的(从create开始,到$$结束,不包含$$) jdbcTemplate.execute(triggerSQL)谢谢@_Yud的回复,这种方案我也试过,没有delimiter,触发器脚本就不完整,不能执行成功,因为在begin和end中间,这条insert语句后需要添加一个分号,如果没有delimiter,到这里就算一条sql,这时的语法是错误的语法 通过java执行bat,bat执行sql文件这种方式,已经成功,现在问题是,我在本地测试,知道数据的安装路径,所以没有问题;但是用户的数据库安装在哪里,我这边不知道,这就导致bat文件可能连接不上数据库。 这是一个CS结构的程序,每个用户都有自己独立的数据库。 首次发帖,不知道怎么结贴,我也没有什么积分,再次感谢<aclass='referer'target='_blank'>@_Yud设个最佳答案就可以了.也省得后来人来回翻页了.
爱吃鱼的程序员 2020-06-14 17:44:43 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 使用规则引擎时,若您的数据为JSON格式,可以编写SQL来解析和处理数据。规则引擎对二进制格式的数据不做解析,直接透传。本文主要讲解SQL表达式。 SQL表达式 JSON数据可以映射为虚拟的表,其中Key对应表的列,Value对应列值,这样就可以使用SQL处理。为便于理解,我们将规则引擎的一条规则抽象为一条SQL表达(类试MySQL语法): 例如某环境传感器用于火灾预警,可以采集温度、湿度及气压数据,上报数据内容如下: { "temperature":25.1 "humidity":65 "pressure":101.5 "location":"xxx,xxx" } 假定温度大于38,湿度小于40时,需要触发报警,可以编写如下的SQL语句:SELECT temperature as t, deviceName() as deviceName, location FROM /ProductA/+/update WHERE temperature > 38 and humidity < 40 当上报的数据中,温度大于38且湿度小于40时,会触发该规则,并且解析数据中的温度、设备名称、位置,用于进一步处理。 FROM FROM 需要填写Topic通配符,用于匹配需要处理的消息Topic。当有符合Topic规则的消息到达时,消息的payload数据以json格式解析,并根据SQL语句进行处理(如果消息格式不合法,将忽略此消息)。您可以使用topic()函数引用具体的Topic值。 上文例子中,"FROM /ProductA/+/update"语句表示该SQL仅处理符合/ProductA/+/update格式的消息,具体匹配参考 Topic。 SELECT JSON数据格式 select语句中的字段,可以使用上报消息的payload解析结果,即json中的键值,也可以使用SQL内置的函数,比如deviceName()。不支持子SQL查询。 上报的json数据格式,可以是数组或者嵌套的json,SQL语句支持使用json path获取其中的属性值,如对于{a:{key1:v1, key2:v2}},可以通过a.key2 获取到值v2。使用变量时需要注意单双引号区别:单引号表示常量,双引号或不加引号表示变量。如使用单引号'a.key2',值为a.key2。 内置的SQL函数可以参考函数列表。 例如上文,"SELECT temperature as t, deviceName() as deviceName, location"语句,其中temperature和loaction来自于上报数据中的字段,deviceName()则使用了内置的SQL函数。 二进制数据格式 目前二进制数据不支持解析payload中的字段,SELECT语句固定为SELECT *,表示透传二进制数据。 WHERE JSON数据格式 规则触发条件,条件表达式。不支持子SQL查询。WHERE中可以使用的字段和SELECT语句一致,当接收到对应topic的消息时,WHERE语句的结果会作为规则是否触发的判断条件。具体条件表达式列表见下方表格。上文例子中, "WHERE temperature > 38 and humidity < 40" 表示温度大于38且湿度小于40时,才会触发该规则,执行配置。 二进制数据格式 目前二进制格式WHERE语句中仅支持内置函数及条件表达式,无法使用payload中的字段。 SQL结果 SQL语句执行完成后,会得到对应的SQL结果,用于下一步转发处理。如果payload数据解析过程中出错会导致规则运行失败。 转发数据动作中的表达式需要使用 ${表达式} 引用对应的值。 对于上文例子,配置转发动作时,可以${t}、${deviceName}和${loaction}获取SQL解析结果,如果要将数据存储到TableStore,配置中可以使用${t}、${deviceName}和${loaction}。 数组使用说明 数组表达式需要使用双引号,比如设备消息为:{a:[{v:1},{v:2},{v:3}]},那么SQL语句中的select写法为:select "$.a[0]" data1,".a[1].v" data2,".a[2]" data3,则data1={v:1},data2=2,data3=[{v:3}]。 条件表达式支持列表 操作符 描述 举例 = 相等 color = ‘red’ <> 不等于 color <> ‘red’ AND 逻辑与 color = ‘red’ AND siren = ‘on’ OR 逻辑或 color = ‘red’ OR siren = ‘on’ ( ) 括号代表一个整体 color = ‘red’ AND (siren = ‘on’ OR isTest) + 算术加法 4 + 5 - 算术减 5 - 4 / 除 20 / 4 * 乘 5 * 4 % 取余数 20 % 6 < 小于 5 < 6 <= 小于或等于 5 <= 6 > 大于 6 > 5 >= 大于或等于 6 >= 5 函数调用 支持函数,详细列表请参考函数列表。 deviceId() JSON属性表达式 可以从消息payload以json表达式提取属性。 state.desired.color,a.b.c[0].d CASE … WHEN … THEN … ELSE …END Case 表达式 CASE col WHEN 1 THEN ‘Y’ WHEN 0 THEN ‘N’ ELSE ‘’ END as flag IN 仅支持枚举,不支持子查询。 比如 where a in(1,2,3)。不支持以下形式: where a in(select xxx) like 匹配某个字符, 仅支持%号通配符,代表匹配任意字符串。 比如 where c1 like ‘%abc’, where c1 not like ‘%def%’
2019-12-01 23:11:54 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 使用规则引擎时,若您的数据为JSON格式,可以编写SQL来解析和处理数据。规则引擎对二进制格式的数据不做解析,直接透传。本文主要讲解SQL表达式。 SQL表达式 JSON数据可以映射为虚拟的表,其中Key对应表的列,Value对应列值,这样就可以使用SQL处理。为便于理解,我们将规则引擎的一条规则抽象为一条SQL表达(类试MySQL语法): 例如某环境传感器用于火灾预警,可以采集温度、湿度及气压数据,上报数据内容如下: { "temperature":25.1 "humidity":65 "pressure":101.5 "location":"xxx,xxx" } 假定温度大于38,湿度小于40时,需要触发报警,可以编写如下的SQL语句:SELECT temperature as t, deviceName() as deviceName, location FROM /ProductA/+/update WHERE temperature > 38 and humidity < 40 当上报的数据中,温度大于38且湿度小于40时,会触发该规则,并且解析数据中的温度、设备名称、位置,用于进一步处理。 FROM FROM 需要填写Topic通配符,用于匹配需要处理的消息Topic。当有符合Topic规则的消息到达时,消息的payload数据以json格式解析,并根据SQL语句进行处理(如果消息格式不合法,将忽略此消息)。您可以使用topic()函数引用具体的Topic值。 上文例子中,"FROM /ProductA/+/update"语句表示该SQL仅处理符合/ProductA/+/update格式的消息,具体匹配参考 Topic。 SELECT JSON数据格式 select语句中的字段,可以使用上报消息的payload解析结果,即json中的键值,也可以使用SQL内置的函数,比如deviceName()。不支持子SQL查询。 上报的json数据格式,可以是数组或者嵌套的json,SQL语句支持使用json path获取其中的属性值,如对于{a:{key1:v1, key2:v2}},可以通过a.key2 获取到值v2。使用变量时需要注意单双引号区别:单引号表示常量,双引号或不加引号表示变量。如使用单引号'a.key2',值为a.key2。 内置的SQL函数可以参考函数列表。 例如上文,"SELECT temperature as t, deviceName() as deviceName, location"语句,其中temperature和loaction来自于上报数据中的字段,deviceName()则使用了内置的SQL函数。 二进制数据格式 目前二进制数据不支持解析payload中的字段,SELECT语句固定为SELECT *,表示透传二进制数据。 WHERE JSON数据格式 规则触发条件,条件表达式。不支持子SQL查询。WHERE中可以使用的字段和SELECT语句一致,当接收到对应topic的消息时,WHERE语句的结果会作为规则是否触发的判断条件。具体条件表达式列表见下方表格。上文例子中, "WHERE temperature > 38 and humidity < 40" 表示温度大于38且湿度小于40时,才会触发该规则,执行配置。 二进制数据格式 目前二进制格式WHERE语句中仅支持内置函数及条件表达式,无法使用payload中的字段。 SQL结果 SQL语句执行完成后,会得到对应的SQL结果,用于下一步转发处理。如果payload数据解析过程中出错会导致规则运行失败。 转发数据动作中的表达式需要使用 ${表达式} 引用对应的值。 对于上文例子,配置转发动作时,可以${t}、${deviceName}和${loaction}获取SQL解析结果,如果要将数据存储到TableStore,配置中可以使用${t}、${deviceName}和${loaction}。 数组使用说明 数组表达式需要使用双引号,比如设备消息为:{a:[{v:1},{v:2},{v:3}]},那么SQL语句中的select写法为:select "$.a[0]" data1,".a[1].v" data2,".a[2]" data3,则data1={v:1},data2=2,data3=[{v:3}]。 条件表达式支持列表 操作符 描述 举例 = 相等 color = ‘red’ <> 不等于 color <> ‘red’ AND 逻辑与 color = ‘red’ AND siren = ‘on’ OR 逻辑或 color = ‘red’ OR siren = ‘on’ ( ) 括号代表一个整体 color = ‘red’ AND (siren = ‘on’ OR isTest) + 算术加法 4 + 5 - 算术减 5 - 4 / 除 20 / 4 * 乘 5 * 4 % 取余数 20 % 6 < 小于 5 < 6 <= 小于或等于 5 <= 6 > 大于 6 > 5 >= 大于或等于 6 >= 5 函数调用 支持函数,详细列表请参考函数列表。 deviceId() JSON属性表达式 可以从消息payload以json表达式提取属性。 state.desired.color,a.b.c[0].d CASE … WHEN … THEN … ELSE …END Case 表达式 CASE col WHEN 1 THEN ‘Y’ WHEN 0 THEN ‘N’ ELSE ‘’ END as flag IN 仅支持枚举,不支持子查询。 比如 where a in(1,2,3)。不支持以下形式: where a in(select xxx) like 匹配某个字符, 仅支持%号通配符,代表匹配任意字符串。 比如 where c1 like ‘%abc’, where c1 not like ‘%def%’
2019-12-01 23:11:54 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 使用规则引擎时,若您的数据为JSON格式,可以编写SQL来解析和处理数据。规则引擎对二进制格式的数据不做解析,直接透传。本文主要讲解SQL表达式。 SQL表达式 JSON数据可以映射为虚拟的表,其中Key对应表的列,Value对应列值,这样就可以使用SQL处理。为便于理解,我们将规则引擎的一条规则抽象为一条SQL表达(类试MySQL语法): 例如某环境传感器用于火灾预警,可以采集温度、湿度及气压数据,上报数据内容如下: { "temperature":25.1 "humidity":65 "pressure":101.5 "location":"xxx,xxx" } 假定温度大于38,湿度小于40时,需要触发报警,可以编写如下的SQL语句:SELECT temperature as t, deviceName() as deviceName, location FROM /ProductA/+/update WHERE temperature > 38 and humidity < 40 当上报的数据中,温度大于38且湿度小于40时,会触发该规则,并且解析数据中的温度、设备名称、位置,用于进一步处理。 FROM FROM 需要填写Topic通配符,用于匹配需要处理的消息Topic。当有符合Topic规则的消息到达时,消息的payload数据以json格式解析,并根据SQL语句进行处理(如果消息格式不合法,将忽略此消息)。您可以使用topic()函数引用具体的Topic值。 上文例子中,"FROM /ProductA/+/update"语句表示该SQL仅处理符合/ProductA/+/update格式的消息,具体匹配参考 Topic。 SELECT JSON数据格式 select语句中的字段,可以使用上报消息的payload解析结果,即json中的键值,也可以使用SQL内置的函数,比如deviceName()。不支持子SQL查询。 上报的json数据格式,可以是数组或者嵌套的json,SQL语句支持使用json path获取其中的属性值,如对于{a:{key1:v1, key2:v2}},可以通过a.key2 获取到值v2。使用变量时需要注意单双引号区别:单引号表示常量,双引号或不加引号表示变量。如使用单引号'a.key2',值为a.key2。 内置的SQL函数可以参考函数列表。 例如上文,"SELECT temperature as t, deviceName() as deviceName, location"语句,其中temperature和loaction来自于上报数据中的字段,deviceName()则使用了内置的SQL函数。 二进制数据格式 目前二进制数据不支持解析payload中的字段,SELECT语句固定为SELECT *,表示透传二进制数据。 WHERE JSON数据格式 规则触发条件,条件表达式。不支持子SQL查询。WHERE中可以使用的字段和SELECT语句一致,当接收到对应topic的消息时,WHERE语句的结果会作为规则是否触发的判断条件。具体条件表达式列表见下方表格。上文例子中, "WHERE temperature > 38 and humidity < 40" 表示温度大于38且湿度小于40时,才会触发该规则,执行配置。 二进制数据格式 目前二进制格式WHERE语句中仅支持内置函数及条件表达式,无法使用payload中的字段。 SQL结果 SQL语句执行完成后,会得到对应的SQL结果,用于下一步转发处理。如果payload数据解析过程中出错会导致规则运行失败。 转发数据动作中的表达式需要使用 ${表达式} 引用对应的值。 对于上文例子,配置转发动作时,可以${t}、${deviceName}和${loaction}获取SQL解析结果,如果要将数据存储到TableStore,配置中可以使用${t}、${deviceName}和${loaction}。 数组使用说明 数组表达式需要使用双引号,比如设备消息为:{a:[{v:1},{v:2},{v:3}]},那么SQL语句中的select写法为:select "$.a[0]" data1,".a[1].v" data2,".a[2]" data3,则data1={v:1},data2=2,data3=[{v:3}]。 条件表达式支持列表 操作符 描述 举例 = 相等 color = ‘red’ <> 不等于 color <> ‘red’ AND 逻辑与 color = ‘red’ AND siren = ‘on’ OR 逻辑或 color = ‘red’ OR siren = ‘on’ ( ) 括号代表一个整体 color = ‘red’ AND (siren = ‘on’ OR isTest) + 算术加法 4 + 5 - 算术减 5 - 4 / 除 20 / 4 * 乘 5 * 4 % 取余数 20 % 6 < 小于 5 < 6 <= 小于或等于 5 <= 6 > 大于 6 > 5 >= 大于或等于 6 >= 5 函数调用 支持函数,详细列表请参考函数列表。 deviceId() JSON属性表达式 可以从消息payload以json表达式提取属性。 state.desired.color,a.b.c[0].d CASE … WHEN … THEN … ELSE …END Case 表达式 CASE col WHEN 1 THEN ‘Y’ WHEN 0 THEN ‘N’ ELSE ‘’ END as flag IN 仅支持枚举,不支持子查询。 比如 where a in(1,2,3)。不支持以下形式: where a in(select xxx) like 匹配某个字符, 仅支持%号通配符,代表匹配任意字符串。 比如 where c1 like ‘%abc’, where c1 not like ‘%def%’
2019-12-01 23:11:54 0 浏览量 回答数 0

问题

OceanBase SQL尚不支持的功能以及需要注意的地方

OceanBase支持SQL 92与兼容MySQL, 原则上只要是MySQL的语法,OceanBase都能运行,本节列出一些尚不支持的功能以及需要注意的地方。 尚不支持的功能 不支持可更新视...
云栖大讲堂 2019-12-01 21:28:29 1314 浏览量 回答数 0

回答

看意思应该是在你要调用的方法操作的对象还没加载出来,试试延迟加载<preclass="brush:js;toolbar:true;auto-links:false;">setTimeout(function(){alert("延迟0.3秒加载")},300); <atarget='_blank'>@呼啦_小呆那应该就是加载顺序的问题,延迟加载试一下。应该都是都加载出来了,但是没有触发onload事件~入浏览器的console看下吧,原因很多(加载顺序,语法错误,冲突等等),这样猜不行。。。。 因为数据肯呢过没有加载彻底页面就已经开始进行样式渲染和JS的数据调用;但是其实是没有数据的;所以会停留在这个错误上;所以你必须等到数据加载完成之后再进行样式渲染和JS数据操作; 如果你的数据使用Ajax获取的json数据这样最好;添加一个$(function(){   $.ajax({      url:'xxx',      type:'GET',      async:false,      success:function(obj)      {         dataJson=obj;      }   })}) 这样的话你其他的操作就必须等所有数据传输过来才能使用;就不会报错了,而导致真个页面程序出错
爱吃鱼的程序员 2020-06-14 21:31:48 0 浏览量 回答数 0

问题

如何创建 RDS 实例之间的双向同步

本小节介绍如何使用数据传输 DTS(以下简称 DTS)快速创建两个 RDS for MySQL 实例之间的双向同步作业,以实现异地多活(单元化),数据容灾等...
云栖大讲堂 2019-12-01 21:25:19 1473 浏览量 回答数 0

回答

mysql的定时任务一般用event(事件)来完成,触发器无法完成。一、通过mysql的命令行客户端来完成 1、set global event_scheduler =1; //开启event_scheduler 执行这个语句如果出现,可在mysql的配置文档中设置[mysqld]段中添加 event_scheduler=ON 如果重启mysql;这种情况下依然出错,Error Code: 1290. The MySQL server is running with the --event-scheduler=DISABLED or --skip-grant-tables option so it cannot execute this statement,这个错误是说启动服务器时如果指定了--skip-grant-tables选项,则event_scheduler则自动被设置为DISABLED。命令行或配置文件的设置都会被覆盖。建议重现安装mysql或是修改启动参数(在系统服务中指定)。 查看event_scheduler状态:show status like '%event%'; 或SELECT @@event_scheduler; 2、CREATE PROCEDURE Mypro() //创建存储过程 BEGIN update userinfo SET endtime = now() WHERE id = '155'; END; 3、创建event My_enevt,每隔三十秒执行一次 create event if not exists e_test on schedule every 30 second on completion preserve do call Mypro(); 4、关闭事件 alter event e_test ON COMPLETION PRESERVE DISABLE; 5、开启事件 alter event e_test ON COMPLETION PRESERVE ENABLE; 语法: CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT 'comment'] DO sql_statement; schedule: AT TIMESTAMP [+ INTERVAL INTERVAL] | EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP] INTERVAL: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} 答案来源于网络,供参考,希望有所帮助。
问问小秘 2019-12-02 02:18:04 0 浏览量 回答数 0

回答

许多Python初学者都会问:我应该学习哪个版本的Python。对于这个问题,我的回答通常是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本。等学得差不多了,再来研究不同版本之间的差别”。 许多Python初学者都会问:我应该学习哪个版本的Python。对于这个问题,我的回答通常是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本。等学得差不多了,再来研究不同版本之间的差别”。但如果想要用Python开发一个新项目,那么该如何选择Python版本呢?我可以负责任的说,大部分Python库都同时支持Python 2.7.x和3.x版本的,所以不论选择哪个版本都是可以的。但为了在使用Python时避开某些版本中一些常见的陷阱,或需要移植某个Python项目时,依然有必要了解一下Python两个常见版本之间的主要区别。__future__模块Python 3.x引入了一些与Python 2不兼容的关键字和特性,在Python 2中,可以通过内置的__future__模块导入这些新内容。如果你希望在Python 2环境下写的代码也可以在Python 3.x中运行,那么建议使用__future__模块。例如,如果希望在Python 2中拥有Python 3.x的整数除法行为,可以通过下面的语句导入相应的模块。from future import division 下表列出了__future__中其他可导入的特性:特性 可选版本 强制版本 效果nested_scopes 2.1.0b1 2.2 PEP 227:Statically Nested Scopesgenerators 2.2.0a1 2.3 PEP 255:Simple Generatorsdivision 2.2.0a2 3.0 PEP 238:Changing the Division Operatorabsolute_import 2.5.0a1 3.0 PEP 328:Imports: Multi-Line and Absolute/Relativewith_statement 2.5.0a1 2.6 PEP 343:The “with” Statementprint_function 2.6.0a2 3.0 PEP 3105:Make print a functionunicode_literals 2.6.0a2 3.0 PEP 3112:Bytes literals in Python 3000(来源: https://docs.python.org/2/library/future.html)示例:from platform import python_version print函数虽然print语法是Python 3中一个很小的改动,且应该已经广为人知,但依然值得提一下:Python 2中的print语句被Python 3中的print()函数取代,这意味着在Python 3中必须用括号将需要输出的对象括起来。在Python 2中使用额外的括号也是可以的。但反过来在Python 3中想以Python2的形式不带括号调用print函数时,会触发SyntaxError。Python 2print 'Python', python_version() print 'Hello, World!' print('Hello, World!') print "text", ; print 'print more text on the same line' Python 2.7.6 Hello, World! Hello, World! text print more text on the same line Python 3print('Python', python_version()) print('Hello, World!') print("some text,", end="") print(' print more text on the same line') Python 3.4.1 Hello, World! some text, print more text on the same line print 'Hello, World!' File "", line 1 print 'Hello, World!' ^ SyntaxError: invalid syntax 注意:在Python中,带不带括号输出”Hello World”都很正常。但如果在圆括号中同时输出多个对象时,就会创建一个元组,这是因为在Python 2中,print是一个语句,而不是函数调用。print 'Python', python_version() print('a', 'b') print 'a', 'b' Python 2.7.7 ('a', 'b') a b 整数除法由于人们常常会忽视Python 3在整数除法上的改动(写错了也不会触发Syntax Error),所以在移植代码或在Python 2中执行Python 3的代码时,需要特别注意这个改动。所以,我还是会在Python 3的脚本中尝试用float(3)/2或 3/2.0代替3/2,以此来避免代码在Python 2环境下可能导致的错误(或与之相反,在Python 2脚本中用from future import division来使用Python 3的除法)。Python 2print 'Python', python_version() print '3 / 2 =', 3 / 2 print '3 // 2 =', 3 // 2 print '3 / 2.0 =', 3 / 2.0 print '3 // 2.0 =', 3 // 2.0 Python 2.7.6 3 / 2 = 1 3 // 2 = 1 3 / 2.0 = 1.5 3 // 2.0 = 1.0 Python 3print('Python', python_version()) print('3 / 2 =', 3 / 2) print('3 // 2 =', 3 // 2) print('3 / 2.0 =', 3 / 2.0) print('3 // 2.0 =', 3 // 2.0) Python 3.4.1 3 / 2 = 1.5 3 // 2 = 1 3 / 2.0 = 1.5 3 // 2.0 = 1.0 UnicodePython 2有基于ASCII的str()类型,其可通过单独的unicode()函数转成unicode类型,但没有byte类型。而在Python 3中,终于有了Unicode(utf-8)字符串,以及两个字节类:bytes和bytearrays。Python 2print 'Python', python_version() Python 2.7.6 print type(unicode('this is like a python3 str type')) print type(b'byte type does not exist') print 'they are really' + b' the same' they are really the same print type(bytearray(b'bytearray oddly does exist though')) Python 3print('Python', python_version()) print('strings are now utf-8 u03BCnicou0394é!') Python 3.4.1 strings are now utf-8 μnicoΔé! print('Python', python_version(), end="") print(' has', type(b' bytes for storing data')) Python 3.4.1 has print('and Python', python_version(), end="") print(' also has', type(bytearray(b'bytearrays'))) and Python 3.4.1 also has 'note that we cannot add a string' + b'bytes for data' TypeError Traceback (most recent call last) in () ----> 1 'note that we cannot add a string' + b'bytes for data' TypeError: Can't convert 'bytes' object to str implicitly xrange在Python 2.x中,经常会用xrange()创建一个可迭代对象,通常出现在“for循环”或“列表/集合/字典推导式”中。这种行为与生成器非常相似(如”惰性求值“),但这里的xrange-iterable无尽的,意味着可能在这个xrange上无限迭代。由于xrange的“惰性求知“特性,如果只需迭代一次(如for循环中),range()通常比xrange()快一些。不过不建议在多次迭代中使用range(),因为range()每次都会在内存中重新生成一个列表。在Python 3中,range()的实现方式与xrange()函数相同,所以就不存在专用的xrange()(在Python 3中使用xrange()会触发NameError)。import timeit n = 10000 def test_range(n): return for i in range(n): pass def test_xrange(n): for i in xrange(n): pass Python 2print 'Python', python_version() print 'ntiming range()' %timeit test_range(n) print 'nntiming xrange()' %timeit test_xrange(n) Python 2.7.6 timing range() 1000 loops, best of 3: 433 µs per loop timing xrange() 1000 loops, best of 3: 350 µs per loop Python 3print('Python', python_version()) print('ntiming range()') %timeit test_range(n) Python 3.4.1 timing range() 1000 loops, best of 3: 520 µs per loop print(xrange(10)) NameError Traceback (most recent call last) in () ----> 1 print(xrange(10)) NameError: name 'xrange' is not defined Python 3中的range对象中的__contains__方法另一个值得一提的是,在Python 3.x中,range有了一个新的__contains__方法。__contains__方法可以有效的加快Python 3.x中整数和布尔型的“查找”速度。x = 10000000 def val_in_range(x, val): return val in range(x) def val_in_xrange(x, val): return val in xrange(x) print('Python', python_version()) assert(val_in_range(x, x/2) == True) assert(val_in_range(x, x//2) == True) %timeit val_in_range(x, x/2) %timeit val_in_range(x, x//2) Python 3.4.1 1 loops, best of 3: 742 ms per loop 1000000 loops, best of 3: 1.19 µs per loop 根据上面的timeit的结果,查找整数比查找浮点数要快大约6万倍。但由于Python 2.x中的range或xrange没有__contains__方法,所以在Python 2中的整数和浮点数的查找速度差别不大。print 'Python', python_version() assert(val_in_xrange(x, x/2.0) == True) assert(val_in_xrange(x, x/2) == True) assert(val_in_range(x, x/2) == True) assert(val_in_range(x, x//2) == True) %timeit val_in_xrange(x, x/2.0) %timeit val_in_xrange(x, x/2) %timeit val_in_range(x, x/2.0) %timeit val_in_range(x, x/2) Python 2.7.7 1 loops, best of 3: 285 ms per loop 1 loops, best of 3: 179 ms per loop 1 loops, best of 3: 658 ms per loop 1 loops, best of 3: 556 ms per loop 下面的代码证明了Python 2.x中没有__contain__方法:print('Python', python_version()) range.__contains__ Python 3.4.1 print('Python', python_version()) range.__contains__ Python 2.7.7 AttributeError Traceback (most recent call last) in () 1 print 'Python', python_version() ----> 2 range.__contains__ AttributeError: 'builtin_function_or_method' object has no attribute '__contains__' print('Python', python_version()) xrange.__contains__ Python 2.7.7 AttributeError Traceback (most recent call last) in () 1 print 'Python', python_version() ----> 2 xrange.__contains__ AttributeError: type object 'xrange' has no attribute '__contains__' 关于Python 2中xrange()与Python 3中range()之间的速度差异的一点说明:有读者指出了Python 3中的range()和Python 2中xrange()执行速度有差异。由于这两者的实现方式相同,因此理论上执行速度应该也是相同的。这里的速度差别仅仅是因为Python 3的总体速度就比Python 2慢。def test_while(): i = 0 while i < 20000: i += 1 return print('Python', python_version()) %timeit test_while() Python 3.4.1 %timeit test_while() 100 loops, best of 3: 2.68 ms per loop print 'Python', python_version() %timeit test_while() Python 2.7.6 1000 loops, best of 3: 1.72 ms per loop 触发异常Python 2支持新旧两种异常触发语法,而Python 3只接受带括号的的语法(不然会触发SyntaxError):Python 2print 'Python', python_version()Python 2.7.6 raise IOError, "file error" IOError Traceback (most recent call last) in ()----> 1 raise IOError, "file error" IOError: file error raise IOError("file error") IOError Traceback (most recent call last) in ()----> 1 raise IOError("file error") IOError: file errorPython 3print('Python', python_version())Python 3.4.1raise IOError, "file error"File "", line 1raise IOError, "file error"^SyntaxError: invalid syntaxThe proper way to raise an exception in Python 3:print('Python', python_version())raise IOError("file error")Python 3.4.1 OSError Traceback (most recent call last) in ()1 print('Python', python_version())----> 2 raise IOError("file error") OSError: file error异常处理Python 3中的异常处理也发生了一点变化。在Python 3中必须使用“as”关键字。Python 2print 'Python', python_version()try: let_us_cause_a_NameError except NameError, err: print err, '--> our error message' Python 2.7.6name 'let_us_cause_a_NameError' is not defined --> our error messagePython 3print('Python', python_version())try: let_us_cause_a_NameError except NameError as err: print(err, '--> our error message') Python 3.4.1name 'let_us_cause_a_NameError' is not defined --> our error messagenext()函数和.next()方法由于会经常用到next()(.next())函数(方法),所以还要提到另一个语法改动(实现方面也做了改动):在Python 2.7.5中,函数形式和方法形式都可以使用,而在Python 3中,只能使用next()函数(试图调用.next()方法会触发AttributeError)。Python 2print 'Python', python_version()my_generator = (letter for letter in 'abcdefg')next(my_generator)my_generator.next()Python 2.7.6'b'Python 3print('Python', python_version())my_generator = (letter for letter in 'abcdefg')next(my_generator)Python 3.4.1'a' my_generator.next() AttributeError Traceback (most recent call last) in ()----> 1 my_generator.next() AttributeError: 'generator' object has no attribute 'next'For循环变量与全局命名空间泄漏好消息是:在Python 3.x中,for循环中的变量不再会泄漏到全局命名空间中了!这是Python 3.x中做的一个改动,在“What’s New In Python 3.0”中有如下描述:“列表推导不再支持[… for var in item1, item2, …]这样的语法,使用[… for var in (item1, item2, …)]代替。还要注意列表推导有不同的语义:现在列表推导更接近list()构造器中的生成器表达式这样的语法糖,特别要注意的是,循环控制变量不会再泄漏到循环周围的空间中了。”Python 2print 'Python', python_version() i = 1print 'before: i =', i print 'comprehension: ', [i for i in range(5)] print 'after: i =', iPython 2.7.6before: i = 1comprehension: [0, 1, 2, 3, 4]after: i = 4Python 3print('Python', python_version()) i = 1print('before: i =', i) print('comprehension:', [i for i in range(5)]) print('after: i =', i)Python 3.4.1before: i = 1comprehension: [0, 1, 2, 3, 4]after: i = 1比较无序类型Python 3中另一个优秀的改动是,如果我们试图比较无序类型,会触发一个TypeError。Python 2print 'Python', python_version()print "[1, 2] > 'foo' = ", [1, 2] > 'foo'print "(1, 2) > 'foo' = ", (1, 2) > 'foo'print "[1, 2] > (1, 2) = ", [1, 2] > (1, 2)Python 2.7.6[1, 2] > 'foo' = False(1, 2) > 'foo' = True[1, 2] > (1, 2) = FalsePython 3print('Python', python_version())print("[1, 2] > 'foo' = ", [1, 2] > 'foo')print("(1, 2) > 'foo' = ", (1, 2) > 'foo')print("[1, 2] > (1, 2) = ", [1, 2] > (1, 2)) Python 3.4.1 TypeError Traceback (most recent call last) in ()1 print('Python', python_version())----> 2 print("[1, 2] > 'foo' = ", [1, 2] > 'foo')3 print("(1, 2) > 'foo' = ", (1, 2) > 'foo')4 print("[1, 2] > (1, 2) = ", [1, 2] > (1, 2))TypeError: unorderable types: list() > str()通过input()解析用户的输入幸运的是,Python 3改进了input()函数,这样该函数就会总是将用户的输入存储为str对象。在Python 2中,为了避免读取非字符串类型会发生的一些危险行为,不得不使用raw_input()代替input()。Python 2Python 2.7.6[GCC 4.0.1 (Apple Inc. build 5493)] on darwinType "help", "copyright", "credits" or "license" for more information. my_input = input('enter a number: ') enter a number: 123 type(my_input) my_input = raw_input('enter a number: ') enter a number: 123 type(my_input) Python 3Python 3.4.1[GCC 4.2.1 (Apple Inc. build 5577)] on darwinType "help", "copyright", "credits" or "license" for more information. my_input = input('enter a number: ') enter a number: 123 type(my_input) 返回可迭代对象,而不是列表在xrange一节中可以看到,某些函数和方法在Python中返回的是可迭代对象,而不像在Python 2中返回列表。由于通常对这些对象只遍历一次,所以这种方式会节省很多内存。然而,如果通过生成器来多次迭代这些对象,效率就不高了。此时我们的确需要列表对象,可以通过list()函数简单的将可迭代对象转成列表。Python 2print 'Python', python_version() print range(3)print type(range(3))Python 2.7.6[0, 1, 2]Python 3print('Python', python_version())print(range(3))print(type(range(3)))print(list(range(3)))Python 3.4.1range(0, 3)[0, 1, 2]下面列出了Python 3中其他不再返回列表的常用函数和方法:zip()map()filter()字典的.key()方法字典的.value()方法字典的.item()方法 __future__模块 [回到目录] Python 3.x引入了一些与Python 2不兼容的关键字和特性,在Python 2中,可以通过内置的__future__模块导入这些新内容。如果你希望在Python 2环境下写的代码也可以在Python 3.x中运行,那么建议使用__future__模块。例如,如果希望在Python 2中拥有Python 3.x的整数除法行为,可以通过下面的语句导入相应的模块。 ? 1 from future import division 下表列出了__future__中其他可导入的特性: 特性 可选版本 强制版本 效果 nested_scopes 2.1.0b1 2.2 PEP 227:Statically Nested Scopes generators 2.2.0a1 2.3 PEP 255:Simple Generators division 2.2.0a2 3.0 PEP 238:Changing the Division Operator absolute_import 2.5.0a1 3.0 PEP 328:Imports: Multi-Line and Absolute/Relative with_statement 2.5.0a1 2.6 PEP 343:The “with” Statement print_function 2.6.0a2 3.0 PEP 3105:Make print a function unicode_literals 2.6.0a2 3.0 PEP 3112:Bytes literals in Python 3000 (来源: https://docs.python.org/2/library/future.html) 示例: ? 1 from platform import python_version print函数 [回到目录] 虽然print语法是Python 3中一个很小的改动,且应该已经广为人知,但依然值得提一下:Python 2中的print语句被Python 3中的print()函数取代,这意味着在Python 3中必须用括号将需要输出的对象括起来。 在Python 2中使用额外的括号也是可以的。但反过来在Python 3中想以Python2的形式不带括号调用print函数时,会触发SyntaxError。 Python 2 ? 1234 print 'Python', python_version()print 'Hello, World!'print('Hello, World!')print "text", ; print 'print more text on the same line' ? 1234 Python 2.7.6Hello, World!Hello, World!text print more text on the same line Python 3 ? 12345 print('Python', python_version())print('Hello, World!') print("some text,", end="") print(' print more text on the same line') ? 123 Python 3.4.1Hello, World!some text, print more text on the same line ? 1 print 'Hello, World!' ? File "", line 1print 'Hello, World!'^SyntaxError: invalid syntax 注意: 在Python中,带不带括号输出”Hello World”都很正常。但如果在圆括号中同时输出多个对象时,就会创建一个元组,这是因为在Python 2中,print是一个语句,而不是函数调用。 ? 123 print 'Python', python_version()print('a', 'b')print 'a', 'b' Python 2.7.7('a', 'b')a b 整数除法 [回到目录] 由于人们常常会忽视Python 3在整数除法上的改动(写错了也不会触发Syntax Error),所以在移植代码或在Python 2中执行Python 3的代码时,需要特别注意这个改动。 所以,我还是会在Python 3的脚本中尝试用float(3)/2或 3/2.0代替3/2,以此来避免代码在Python 2环境下可能导致的错误(或与之相反,在Python 2脚本中用from future import division来使用Python 3的除法)。 Python 2 ? 12345 print 'Python', python_version()print '3 / 2 =', 3 / 2print '3 // 2 =', 3 // 2print '3 / 2.0 =', 3 / 2.0print '3 // 2.0 =', 3 // 2.0 Python 2.7.63 / 2 = 13 // 2 = 13 / 2.0 = 1.53 // 2.0 = 1.0 Python 3 ? 12345 print('Python', python_version())print('3 / 2 =', 3 / 2)print('3 // 2 =', 3 // 2)print('3 / 2.0 =', 3 / 2.0)print('3 // 2.0 =', 3 // 2.0) Python 3.4.13 / 2 = 1.53 // 2 = 13 / 2.0 = 1.53 // 2.0 = 1.0 Unicode [回到目录] Python 2有基于ASCII的str()类型,其可通过单独的unicode()函数转成unicode类型,但没有byte类型。 而在Python 3中,终于有了Unicode(utf-8)字符串,以及两个字节类:bytes和bytearrays。 Python 2 ? 1 print 'Python', python_version() Python 2.7.6 ? 1 print type(unicode('this is like a python3 str type')) ? 1 print type(b'byte type does not exist') ? 1 print 'they are really' + b' the same' they are really the same ? 1 print type(bytearray(b'bytearray oddly does exist though')) Python 3 ? 12 print('Python', python_version())print('strings are now utf-8 u03BCnicou0394é!') Python 3.4.1strings are now utf-8 μnicoΔé! ? 12 print('Python', python_version(), end="")print(' has', type(b' bytes for storing data')) Python 3.4.1 has ? 12 print('and Python', python_version(), end="")print(' also has', type(bytearray(b'bytearrays'))) and Python 3.4.1 also has ? 1 'note that we cannot add a string' + b'bytes for data' TypeError Traceback (most recent call last) in ()----> 1 'note that we cannot add a string' + b'bytes for data' TypeError: Can't convert 'bytes' object to str implicitly xrange [回到目录] 在Python 2.x中,经常会用xrange()创建一个可迭代对象,通常出现在“for循环”或“列表/集合/字典推导式”中。 这种行为与生成器非常相似(如”惰性求值“),但这里的xrange-iterable无尽的,意味着可能在这个xrange上无限迭代。 由于xrange的“惰性求知“特性,如果只需迭代一次(如for循环中),range()通常比xrange()快一些。不过不建议在多次迭代中使用range(),因为range()每次都会在内存中重新生成一个列表。 在Python 3中,range()的实现方式与xrange()函数相同,所以就不存在专用的xrange()(在Python 3中使用xrange()会触发NameError)。 ? 12345678910 import timeit n = 10000def test_range(n): return for i in range(n): pass def test_xrange(n): for i in xrange(n): pass Python 2 ? 1234567 print 'Python', python_version() print 'ntiming range()'%timeit test_range(n) print 'nntiming xrange()'%timeit test_xrange(n) Python 2.7.6 timing range()1000 loops, best of 3: 433 µs per loop timing xrange()1000 loops, best of 3: 350 µs per loop Python 3 ? 1234 print('Python', python_version()) print('ntiming range()')%timeit test_range(n) Python 3.4.1 timing range()1000 loops, best of 3: 520 µs per loop ? 1 print(xrange(10)) NameError Traceback (most recent call last)in ()----> 1 print(xrange(10)) NameError: name 'xrange' is not defined Python 3中的range对象中的__contains__方法 另一个值得一提的是,在Python 3.x中,range有了一个新的__contains__方法。__contains__方法可以有效的加快Python 3.x中整数和布尔型的“查找”速度。 ? 123456789101112 x = 10000000def val_in_range(x, val): return val in range(x) def val_in_xrange(x, val): return val in xrange(x) print('Python', python_version())assert(val_in_range(x, x/2) == True)assert(val_in_range(x, x//2) == True)%timeit val_in_range(x, x/2)%timeit val_in_range(x, x//2) Python 3.4.11 loops, best of 3: 742 ms per loop1000000 loops, best of 3: 1.19 µs per loop 根据上面的timeit的结果,查找整数比查找浮点数要快大约6万倍。但由于Python 2.x中的range或xrange没有__contains__方法,所以在Python 2中的整数和浮点数的查找速度差别不大。 ? 12345678910 print 'Python', python_version() assert(val_in_xrange(x, x/2.0) == True)assert(val_in_xrange(x, x/2) == True)assert(val_in_range(x, x/2) == True)assert(val_in_range(x, x//2) == True)%timeit val_in_xrange(x, x/2.0)%timeit val_in_xrange(x, x/2)%timeit val_in_range(x, x/2.0)%timeit val_in_range(x, x/2) Python 2.7.71 loops, best of 3: 285 ms per loop1 loops, best of 3: 179 ms per loop1 loops, best of 3: 658 ms per loop1 loops, best of 3: 556 ms per loop 下面的代码证明了Python 2.x中没有__contain__方法: ? 12 print('Python', python_version())range.__contains__ Python 3.4.1 ? 12 print('Python', python_version())range.__contains__ Python 2.7.7 AttributeError Traceback (most recent call last) in ()1 print 'Python', python_version()----> 2 range.__contains__ AttributeError: 'builtin_function_or_method' object has no attribute '__contains__' ? 12 print('Python', python_version())xrange.__contains__ Python 2.7.7 AttributeError Traceback (most recent call last)in ()1 print 'Python', python_version()----> 2 xrange.__contains__ AttributeError: type object 'xrange' has no attribute '__contains__' 关于Python 2中xrange()与Python 3中range()之间的速度差异的一点说明: 有读者指出了Python 3中的range()和Python 2中xrange()执行速度有差异。由于这两者的实现方式相同,因此理论上执行速度应该也是相同的。这里的速度差别仅仅是因为Python 3的总体速度就比Python 2慢。 ? 12345 def test_while(): i = 0 while i < 20000: i += 1 return ? 12 print('Python', python_version())%timeit test_while() Python 3.4.1%timeit test_while()100 loops, best of 3: 2.68 ms per loop ? 12 print 'Python', python_version()%timeit test_while() Python 2.7.61000 loops, best of 3: 1.72 ms per loop 触发异常 [回到目录] Python 2支持新旧两种异常触发语法,而Python 3只接受带括号的的语法(不然会触发SyntaxError): Python 2 ? 1 print 'Python', python_version() Python 2.7.6 ? 1 raise IOError, "file error" IOError Traceback (most recent call last) in ()----> 1 raise IOError, "file error" IOError: file error ? 1 raise IOError("file error") IOError Traceback (most recent call last) in ()----> 1 raise IOError("file error") IOError: file error Python 3 ? 1 print('Python', python_version()) Python 3.4.1 ? 1 raise IOError, "file error" File "", line 1raise IOError, "file error"^SyntaxError: invalid syntaxThe proper way to raise an exception in Python 3: ? 12 print('Python', python_version())raise IOError("file error") Python 3.4.1 OSError Traceback (most recent call last) in ()1 print('Python', python_version())----> 2 raise IOError("file error") OSError: file error 异常处理 [回到目录] Python 3中的异常处理也发生了一点变化。在Python 3中必须使用“as”关键字。 Python 2 ? 12345 print 'Python', python_version()try: let_us_cause_a_NameErrorexcept NameError, err: print err, '--> our error message' Python 2.7.6name 'let_us_cause_a_NameError' is not defined --> our error message Python 3 ? 12345 print('Python', python_version())try: let_us_cause_a_NameErrorexcept NameError as err: print(err, '--> our error message') Python 3.4.1name 'let_us_cause_a_NameError' is not defined --> our error message next()函数和.next()方法 [回到目录] 由于会经常用到next()(.next())函数(方法),所以还要提到另一个语法改动(实现方面也做了改动):在Python 2.7.5中,函数形式和方法形式都可以使用,而在Python 3中,只能使用next()函数(试图调用.next()方法会触发AttributeError)。 Python 2 ? 1234 print 'Python', python_version()my_generator = (letter for letter in 'abcdefg')next(my_generator)my_generator.next() Python 2.7.6'b' Python 3 ? 123 print('Python', python_version())my_generator = (letter for letter in 'abcdefg')next(my_generator) Python 3.4.1'a' ? 1 my_generator.next() AttributeError Traceback (most recent call last) in ()----> 1 my_generator.next() AttributeError: 'generator' object has no attribute 'next' For循环变量与全局命名空间泄漏 [回到目录] 好消息是:在Python 3.x中,for循环中的变量不再会泄漏到全局命名空间中了! 这是Python 3.x中做的一个改动,在“What's New In Python 3.0”中有如下描述: “列表推导不再支持[... for var in item1, item2, ...]这样的语法,使用[... for var in (item1, item2, ...)]代替。还要注意列表推导有不同的语义:现在列表推导更接近list()构造器中的生成器表达式这样的语法糖,特别要注意的是,循环控制变量不会再泄漏到循环周围的空间中了。” Python 2 ? 12345678 print 'Python', python_version() i = 1print 'before: i =', i print 'comprehension: ', [i for i in range(5)] print 'after: i =', i Python 2.7.6before: i = 1comprehension: [0, 1, 2, 3, 4]after: i = 4 Python 3 ? 12345678 print('Python', python_version()) i = 1print('before: i =', i) print('comprehension:', [i for i in range(5)]) print('after: i =', i) Python 3.4.1before: i = 1comprehension: [0, 1, 2, 3, 4]after: i = 1 比较无序类型 [回到目录] Python 3中另一个优秀的改动是,如果我们试图比较无序类型,会触发一个TypeError。 Python 2 ? 1234 print 'Python', python_version()print "[1, 2] > 'foo' = ", [1, 2] > 'foo'print "(1, 2) > 'foo' = ", (1, 2) > 'foo'print "[1, 2] > (1, 2) = ", [1, 2] > (1, 2) Python 2.7.6[1, 2] > 'foo' = False(1, 2) > 'foo' = True[1, 2] > (1, 2) = False Python 3 ? 1234 print('Python', python_version())print("[1, 2] > 'foo' = ", [1, 2] > 'foo')print("(1, 2) > 'foo' = ", (1, 2) > 'foo')print("[1, 2] > (1, 2) = ", [1, 2] > (1, 2)) Python 3.4.1 TypeError Traceback (most recent call last) in ()1 print('Python', python_version())----> 2 print("[1, 2] > 'foo' = ", [1, 2] > 'foo')3 print("(1, 2) > 'foo' = ", (1, 2) > 'foo')4 print("[1, 2] > (1, 2) = ", [1, 2] > (1, 2))TypeError: unorderable types: list() > str() 通过input()解析用户的输入 [回到目录] 幸运的是,Python 3改进了input()函数,这样该函数就会总是将用户的输入存储为str对象。在Python 2中,为了避免读取非字符串类型会发生的一些危险行为,不得不使用raw_input()代替input()。 Python 2 ? 1234567891011121314151617 Python 2.7.6[GCC 4.0.1 (Apple Inc. build 5493)] on darwinType "help", "copyright", "credits" or "license" for more information. my_input = input('enter a number: ') enter a number: 123 type(my_input) my_input = raw_input('enter a number: ') enter a number: 123 type(my_input) Python 3 ? 12345678 Python 3.4.1[GCC 4.2.1 (Apple Inc. build 5577)] on darwinType "help", "copyright", "credits" or "license" for more information. my_input = input('enter a number: ') enter a number: 123 type(my_input) 返回可迭代对象,而不是列表 [回到目录] 在xrange一节中可以看到,某些函数和方法在Python中返回的是可迭代对象,而不像在Python 2中返回列表。 由于通常对这些对象只遍历一次,所以这种方式会节省很多内存。然而,如果通过生成器来多次迭代这些对象,效率就不高了。 此时我们的确需要列表对象,可以通过list()函数简单的将可迭代对象转成列表。 Python 2 ? 1234 print 'Python', python_version() print range(3)print type(range(3)) Python 2.7.6[0, 1, 2] Python 3 ? 1234 print('Python', python_version())print(range(3))print(type(range(3)))print(list(range(3))) Python 3.4.1range(0, 3)[0, 1, 2] 下面列出了Python 3中其他不再返回列表的常用函数和方法:•zip()•map()•filter()•字典的.key()方法•字典的.value()方法•字典的.item()方法 更多关于Python 2和Python 3的文章 [回到目录] 下面列出了其他一些可以进一步了解Python 2和Python 3的优秀文章, //迁移到 Python 3•Should I use Python 2 or Python 3 for my development activity?•What's New In Python 3.0•Porting to Python 3•Porting Python 2 Code to Python 3•How keep Python 3 moving forward // 对Python 3的褒与贬•10 awesome features of Python that you can't use because you refuse to upgrade to Python 3•关于你不想知道的所有Python3 unicode特性•Python 3 正在毁灭 Python•Python 3 能振兴 Python•Python 3 is fine
xuning715 2019-12-02 01:10:35 0 浏览量 回答数 0

回答

原生XML扩展 我更喜欢使用其中一个原生XML扩展,因为它们与PHP捆绑在一起,通常比所有第三方库更快,并且在标记上给我所需的所有控制权。 DOM DOM扩展允许您使用PHP 5通过DOM API操作XML文档。它是W3C的文档对象模型核心级别3的实现,这是一个平台和语言中立的接口,允许程序和脚本动态访问和更新文件的内容,结构和风格。 DOM能够解析和修改现实世界(破碎)的HTML,并且可以执行XPath查询。它基于libxml。 使用DOM需要一些时间才能提高效率,但这个时间非常值得IMO。由于DOM是一个与语言无关的接口,因此您可以找到多种语言的实现,因此如果您需要更改编程语言,那么您很可能已经知道如何使用该语言的DOM API。 一个基本的用法示例可以在抓取A元素的href属性中找到,一般的概念概述可以在php的DOMDocument中找到 StackOverflow上已经广泛介绍了如何使用DOM扩展,因此如果您选择使用它,您可以确定您遇到的大多数问题都可以通过搜索/浏览Stack Overflow来解决。 XMLReader的 XMLReader扩展是一个XML pull解析器。读取器在文档流上作为光标前进,并在途中停在每个节点上。 与DOM一样,XMLReader基于libxml。我不知道如何触发HTML解析器模块,因此使用XMLReader解析损坏的HTML的可能性可能不如使用DOM,因为您可以明确告诉它使用libxml的HTML解析器模块。 使用php从h1标签获取所有值时,可以找到一个基本用法示例 XML解析器 此扩展允许您创建XML解析器,然后为不同的XML事件定义处理程序。每个XML解析器还有一些您可以调整的参数。 XML Parser库也基于libxml,并实现了SAX样式的XML推送解析器。它可能是比DOM或SimpleXML更好的内存管理选择,但是比XMLReader实现的pull解析器更难以使用。 SimpleXML的 SimpleXML扩展提供了一个非常简单且易于使用的工具集,用于将XML转换为可以使用普通属性选择器和数组迭代器处理的对象。 当您知道HTML是有效的XHTML时,SimpleXML是一个选项。如果你需要解析破碎的HTML,甚至不要考虑SimpleXml,因为它会窒息。 一个基本的用法示例可以在一个简单的CRUD节点程序和xml文件的节点值中找到,PHP手册中还有很多其他的例子。 第三方库(基于libxml) 如果您更喜欢使用第三方库,我建议使用实际上使用DOM / libxml而不是字符串解析的库。 FluentDom - 回购 FluentDOM为PHP中的DOMDocument提供了类似jQuery的流畅XML接口。选择器是用XPath或CSS编写的(使用CSS到XPath转换器)。当前版本扩展了DOM实现标准接口并添加了DOM Living Standard的功能。FluentDOM可以加载JSON,CSV,JsonML,RabbitFish等格式。可以通过Composer安装。 HtmlPageDom Wa72 \ HtmlPageDom`是一个用于轻松操作HTML文档的PHP库。它需要来自Symfony2组件的DomCrawler来遍历DOM树,并通过添加操作HTML文档的DOM树的方法来扩展它。 phpQuery(多年未更新) phpQuery是一个服务器端,可链接,CSS3选择器驱动的文档对象模型(DOM)API,基于用PHP5编写的jQuery JavaScript库,并提供额外的命令行界面(CLI)。 另见:https://github.com/electrolinux/phpquery Zend_Dom Zend_Dom提供了处理DOM文档和结构的工具。目前,我们提供Zend_Dom_Query,它提供了一个统一的界面,可以使用XPath和CSS选择器查询DOM文档。 的QueryPath QueryPath是一个用于操作XML和HTML的PHP​​库。它不仅适用于本地文件,还适用于Web服务和数据库资源。它实现了许多jQuery接口(包括CSS样式的选择器),但它在服务器端使用时经过了大量调整。可以通过Composer安装。 fDOMDocument fDOMDocument扩展了标准DOM,以便在所有错误情况下使用异常,而不是PHP警告或通知。为方便起见,他们还添加了各种自定义方法和快捷方式,并简化了DOM的使用。 军刀/ XML saber / xml是一个包装和扩展XMLReader和XMLWriter类的库,用于创建一个简单的“xml到对象/数组”映射系统和设计模式。编写和读取XML是单遍的,因此可以快速并且需要大型xml文件的低内存。 FluidXML FluidXML是一个用于使用简洁流畅的API来操作XML的PHP​​库。它利用XPath和流畅的编程模式,既有趣又有效。 第三方(不是基于libxml的) 构建DOM / libxml的好处是,您可以获得良好的开箱即用性能,因为您基于本机扩展。但是,并非所有第三方库都沿着这条路线行进。其中一些列在下面 PHP简单的HTML DOM解析器 用PHP5 +编写的HTML DOM解析器允许您以非常简单的方式操作HTML! 需要PHP 5+。 支持无效的HTML。 使用选择器在HTML页面上查找标签,就像jQuery一样。 从一行中提取HTML中的内容。 我一般不推荐这个解析器。代码库很糟糕,解析器本身很慢而且内存很耗。并非所有jQuery选择器(例如子选择器)都是可能的。任何基于libxml的库都应该比这更容易。 PHP Html解析器 PHPHtmlParser是一个简单,灵活的html解析器,允许您使用任何css选择器(如jQuery)选择标签。目标是帮助开发需要快速,简单的方法来废弃html的工具,无论它是否有效!这个项目最初是由sunra / php-simple-html-dom-parser支持的,但支持似乎已经停止,所以这个项目是我对他以前工作的改编。 同样,我不推荐这个解析器。CPU使用率很高,速度相当慢。还没有清除已创建DOM对象的内存的功能。这些问题尤其适用于嵌套循环。文档本身不准确且拼写错误,自4月14日以来没有回复修复。 加农 通用标记器和HTML / XML / RSS DOM解析器 能够操纵元素及其属性 支持无效的HTML和UTF8 可以对元素执行类似CSS3的高级查询(比如jQuery - 支持的命名空间) HTML美化器(如HTML Tidy) 缩小CSS和Javascript 排序属性,更改字符大小写,更正缩进等。 扩展 使用基于当前字符/标记的回调解析文档 操作以较小的功能分隔,以便轻松覆盖 快速而简单 从未使用过它。不知道它是否有用。 HTML 5 您可以使用上面的方法来解析HTML5,但由于HTML5允许的标记,可能会有怪癖。因此,对于HTML5,您要考虑使用专用解析器,例如 html5lib 基于WHATWG HTML5规范的HTML解析器的Python和PHP实现,可与主要桌面Web浏览器实现最大兼容性。 HTML5最终确定后,我们可能会看到更多专用解析器。还有一个W3的博客文章,名为How-To for html 5 parsing,值得一试。 网页服务 如果您不想编写PHP,您也可以使用Web服务。一般来说,我发现这些实用程序很少,但那只是我和我的用例。 ScraperWiki。 ScraperWiki的外部界面允许您以您希望在Web或您自己的应用程序中使用的形式提取数据。您还可以提取有关任何刮刀状态的信息。 常用表达 最后也是最不推荐的,您可以使用正则表达式从HTML中提取数据。通常,不鼓励在HTML上使用正则表达式。 您可以在网上找到与标记相匹配的大多数片段都很脆弱。在大多数情况下,它们只适用于非常特殊的HTML。微小的标记更改,例如在某处添加空格,或添加或更改标记中的属性,可以使RegEx在未正确编写时失败。在HTML上使用RegEx之前,您应该知道自己在做什么。 HTML解析器已经知道HTML的语法规则。必须为您编写的每个新RegEx讲授正则表达式。RegEx在某些情况下很好,但它实际上取决于您的用例。 您可以编写更可靠的解析器,但是使用正则表达式编写完整可靠的自定义解析器是浪费时间,因为上述库已经存在并且在此方面做得更好。
游客gsy3rkgcdl27k 2019-12-02 02:09:37 0 浏览量 回答数 0

问题

SQL 兼容性怎么样?

[font=PingFangSC, "]DRDS 高度兼容 MySQL 协议和语法,但由于分布式数据库和单机数据库存在较大的架构差异,存在 SQL 使用限制。相关兼容性和 SQL 限制描述如下。 ...
猫饭先生 2019-12-01 21:19:24 905 浏览量 回答数 0

问题

【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』

评测介绍 评测产品: 云引擎ACE服务开发语言: PHP评测人: mr_wid评测时间: 2014年10月13日-19日 评测概要 非常有幸能够申请到ACE的公测资格, 在本篇评测中, 笔者将以一个开发者的角度来对云引擎...
mr_wid 2019-12-01 21:10:06 20092 浏览量 回答数 6

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务