You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
需要调整sql语句,将子查询包一层(select * from (子查询) as xxx)
DELETE FROM housekeeping.User
WHERE ( (username IN (SELECT * FROM (SELECT username FROM housekeeping.User WHERE ( (username = 'test1') )) as a) ) )
Activity
cloudAndMonkey commentedon Nov 18, 2022
请问 apijson5.3 支持 delete 通过条件删除了吗?
delete from xxx where id in (select xxx_id from dd where ...);
delete from xxx where conditions
我用5.4测了一下还是不行呀

TommyLemon commentedon Nov 18, 2022
其它 BG 有同事做了,但暂时应该不会开源。
APIAuto 新增支持:
1.点击各种超链接智能生成 APIJSON 请求的 URL + JSON
#37 (comment)
2.自动推荐智能补全参数(APIJSON)
#37 (comment)
已经比以上在表格 UI 上点点选选的方案要方便高效很多了。
TommyLemon commentedon Nov 18, 2022
支持传这个子查询条件,但还是必须再传 id/id{} ,可以改下源码

AbstractVerifier 新增一个
public static boolean IS_UPDATE_MUST_HAVE_ID_CONDITION = true; // 为 PUT, DELETE 强制要求必须有 id/id{} 条件
子类把值设置为 false,然后对应
AbstractVerifier.verifyId 对应校验的地方,传参 atLeastOne: true 改为 IS_FORCE_ID_CONDITION_4_WRITE
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractVerifier.java#L676
TommyLemon commentedon Nov 18, 2022
改了后麻烦提交 PR 贡献下代码哦,开源要大家一起参与贡献才会更美好~

https://github.com/Tencent/APIJSON/blob/master/CONTRIBUTING.md#%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%80%E5%AE%9A%E8%A6%81%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81
cloudAndMonkey commentedon Nov 18, 2022
我这边的场景是:
通过选择表单字段或者在线表结构 去生成 单表、多表json语句模版.减少前端学习成本
APIAuto 空了让前端的小伙伴研究一下, 我刚才点击一个表字段,然后生成了json语句, 看看能不能复用
TommyLemon commentedon Nov 18, 2022
增删改查都支持,能根据权限角色配置、参数校验规则来生成,还能点 [' / "] 按钮切换生成简单接口模式,多点点试试
cloudAndMonkey commentedon Nov 22, 2022
嗯, 需要的场景不一样
cloudAndMonkey commentedon Nov 23, 2022
@TommyLemon
修改支持非id条件删除,上次讨论你给的解决方案如下:
支持传这个子查询条件,但还是必须再传 id/id{} ,可以改下源码 AbstractVerifier 新增一个 public static boolean IS_UPDATE_MUST_HAVE_ID_CONDITION = true; // 为 PUT, DELETE 强制要求必须有 id/id{} 条件 子类把值设置为 false,然后对应 AbstractVerifier.verifyId 对应校验的地方,传参 atLeastOne: true 改为 IS_FORCE_ID_CONDITION_4_WRITE
我思考了一下 ,按照上面的解决方案, 存在控制粗力度的问题.

调用 verifyId 是在 new OnParseCallback() {} 内部, 只能调用 静态方法, 静态方法没法在子类里面重载, 所以就只能作为全局开关.
如果想要细粒度的控制某一张表, 可以通过 request structure must条件来控制即可

cloudAndMonkey commentedon Nov 23, 2022
@TommyLemon


非id删除, ref 删除 支持 with-as 我都搞定了
但是有一种情况,你看看需不需要处理:
{
"sql@": {
"@method": "GET",
"with": true,
"from": "User",
"User": {
"@column": "username",
"username": "test1"
}
},
"User": {
"@method": "DELETE",
"username{}@": "sql"
},
"explan": true
}
删除操作 主表 和 子查询 是同一张表
mysql8以下 非with-as表达式 会报错:
"msg": "You can't specify target table 'User' for update in FROM clause",
需要调整sql语句,将子查询包一层(select * from (子查询) as xxx)
DELETE FROM
housekeeping.UserWHERE ( (
usernameIN (SELECT * FROM (SELECTusernameFROMhousekeeping.UserWHERE ( (username= 'test1') )) as a) ) )我已经改了

TommyLemon commentedon Nov 23, 2022
赞,也可以根据 MySQL 版本来做不同处理
isMySQL() && getDBVersionNums()[0] >= 8
TommyLemon commentedon Nov 23, 2022
是这样,静态变量做全局处理,特殊接口用 Operation.MUST id/id{} 做自定义处理。
之所以默认必传,是因为安全意识不够、编码粗心大意的人太多了,所以要有一个底线保障,尽可能避免安全隐患。