内联删除查询,Node JS,Knex JS
这个查询工作:
var query = knex('project_member') .join('project', 'project_member.pm_project', '=', 'project.prj_id') .join('users', 'project_member.pm_user', '=', 'users.us_id') .where({ prj_number: inputs.params.prj_number }) .select('pm_project', 'us_name', 'us_alias');
query.toString()给出:
select "pm_project", "us_name", "us_alias" from "project_member" inner join "project" on "project_member"."pm_project" = "project"."prj_id" inner join "users" on "project_member"."pm_user" = "users"."us_id" where "prj_number" = '4026305'
此查询不起作用:
var query = knex('project_member') .join('project', 'project_member.pm_project', '=', 'project.prj_id') .where({ prj_number: inputs.params.prj_number, pm_user: inputs.params.pm_user }) .del();
query.toString()给出:
delete from "project_member" where "prj_number" = '4026305' and "pm_user" = '1'
不能使用联接删除查询? 你我必须做一个单独的查询来join他们吗?
看起来删除联接工作不正常(可能是因为各种数据库的删除联接语法不同),但是您应该能够将查询重写为简单的IN查询;
DELETE FROM project_member WHERE pm_user = <pm user> AND pm_project IN ( SELECT prj_id FROM project WHERE prj_number = <prj_number> )
…应该由(未经testing)产生的;
knex('project_member') .where('pm_user', inputs.params.pm_user) .whereIn('pm_project', function() { this.select('prj_id') .from('project') .where('prj_number', inputs.params.prj_number); }) .del()
…并且始终记得在数据库上运行互联网上的随机人员运行潜在的破坏性SQL之前备份数据;-)