node.js - Node & SQL:复杂的插入 vs sql 函数
问题描述
我正在设计 node + postgres web 服务,我需要对 3 个表进行 3 次插入。我应该在节点后端代码中执行 3 个单独的插入查询,还是实现 postresql 函数。
例子:
insert into users(id, name, address) values (1, 'username', 'address') returning id as userid;
insert into company(id, contactPersonId, name) values (11, 1, 'Companyname) returning id as companyid;
insert into report(id, userid, companyid) values (111,1,11);
或者有一个功能:
create or replace function add_report_details(userid, username, address, companyid, companyname, reportid)
....
insert into users(id, name, address) values (1, 'username', 'address') returning id as userid;
insert into company(id, contactPersonId, name) values (11, 1, 'Companyname') returning id as companyid;
insert into report(id, userid, companyid) values (111,1,11);
....
用函数实现这个似乎是更好的选择,因为这样我就不必在表结构发生变化或我想实现一些附加功能时将插入查询更改为代码中的多个位置。
使用函数是否还有其他好处,或者是否有其他方法来处理这个问题?
编辑:我从中得出的结论是,为了可读性和可维护性,最好将插入查询保留在 js 函数中。然而,更复杂的解决方案可能与数据库有更多的关系,因此在这种情况下,函数/过程可能是首选方法。
如果您决定使用函数,还需要考虑以下几点:如何使用 postgresql 中的存储过程将数据插入表中
如果您对在代码中的查询上使用 sql 函数有任何其他建议或意见,请在下面发表评论。我觉得这是很常见的问题,或者我不知道限制/最佳实践。
感谢您的回答和反馈!
解决方案
您可以使用 CTE 进行单个查询:
WITH s1 AS (
insert into users(id, name, address) values (1, 'username', 'address')
returning id as userid
), s2 AS (
insert into company(id, contactPersonId, name)
SELECT 11
, userid
, 'Companyname')
FROM s1
returning id as companyid, userid
)
insert into report(id, userid, companyid)
SELECT 111
, userid
, companyid
FROM s2;
(未测试)
推荐阅读
- ios - 如何在ios中将应用程序上传到应用程序商店时解决此问题
- javascript - Angular 5 viewchild 只能工作一次
- css - div 中的文本与具有表格单元格显示属性的图像对齐
- c# - 游戏在统一上运行良好,但在 android 上运行不正常
- swift - 在 Swift 3 中刷新集合视图后点击发送按钮时重复数据?
- jdk1.6 - bootstrap-4.0-dist 给出错误消息,将 jdk1.6 与 myeclipse 10 匹配
- c# - 修复 C# 中的 A* 实现
- r - 如何命名数据框以便我可以在列表中查找它
- reactjs - 映射-reactjs 时出现一些语法错误
- c - 无法在 C 中创建目录?