【发布时间】:2018-04-17 01:32:22
【问题描述】:
我有一个users 表,我有一个oauth 表。
oauth 表包含三列:
- user_id
- oauth_id
- oauth_provider
oauth 表的目的是将提供者 ID 链接到内部用户 ID,并为每个用户提供唯一标识符。
我试图让自己进入一种情况,我可以将users 的id 列与oauth 的user_id 同步。
我试过的东西:
node 环境,node-postgres 作为 DB 客户端。
export default function addUser(user: UserDetails) {
const { displayName, phoneNumber, isDriver, oauthId, oauthProvider } = user;
let query;
query = {
text:
'INSERT INTO users(display_name, phone_number, is_driver) VALUES ($1, $2, $3);',
values: [displayName, phoneNumber, isDriver]
};
executeQuery(query);
query = {
text: // Something Else?
'INSERT INTO oauth(user_id, oauth_id, oauth_provider) VALUES ((select max(id) from users), $1, $2);',
values: [oauthId, oauthProvider]
};
executeQuery(query);
}
这是有风险的,如果同时完成两个请求,这将不起作用。 处理这种情况的方法是什么?谢谢。
编辑
我想我找到了解决方案,这是线程安全的吗?
export default async function addUser(user: UserDetails) {
const { displayName, phoneNumber, isDriver, oauthId, oauthProvider } = user;
let query;
query = {
text:
'INSERT INTO users(display_name, phone_number, is_driver) VALUES ($1, $2, $3) RETURNING id;',
values: [displayName, phoneNumber, isDriver]
};
const result = await executeQuery(query);
if (result)
query = {
text:
'INSERT INTO oauth(user_id, oauth_id, oauth_provider) VALUES ($1, $2, $3);',
values: [result[0].id, oauthId, oauthProvider]
};
executeQuery(query);
}
【问题讨论】:
-
我觉得不错。更进一步,我会为此使用 Sequelize,因为我相信您正在重新发明轮子。
标签: node.js postgresql database-design