Sha*_*awn 7 postgresql foreign-key composite-types
我正在使用Sequelize(命中 PostgreSQL 数据库)开发高级查询。在纯 SQL 中这并不难,但我无法在 Sequelize 中使用它,部分原因是它们不支持复合外键。
描述我的问题的最好方法是用代码,所以我用我的问题的最小复制制作了一个存储库。您应该能够克隆它并按照自述文件中的说明在本地重现问题。基本上,如果您可以使查询无错误地运行并正确返回一个空的行数组,那么您就解决了我的问题:)
为方便起见,我将在此处复制查询和输出本身,但您可以检查 repo 以查看迁移、模型和 Sequelize 配置。
查询
const performQuery = (db) => {
const { usersRoles, invitations } = db; // eslint-disable-line max-len
const sql = {
include: {
model: invitations,
on: {
user: Sequelize.where(
Sequelize.col('usersRoles.userUid'),
'=',
Sequelize.col('invitations.guestUid')),
propertyManager: Sequelize.where(
Sequelize.col('usersRoles.propertyManagerUid'),
'=',
Sequelize.col('invitations.propertyManagerUid')),
tenant: Sequelize.where(
Sequelize.col('usersRoles.tenantUid'),
'=',
Sequelize.col('invitations.tenantUid')),
},
},
};
return usersRoles.findAll(sql);
};
Run Code Online (Sandbox Code Playgroud)
输出(截断)
TypeError: Cannot read property 'toUpperCase' of undefined
at str.trim.replace (/home/shawn/git/waltzapp/sequelize-troubleshooting/node_modules/sequelize/lib/utils.js:108:60)
at RegExp.[Symbol.replace] (native)
at RegExp.[Symbol.replace] (native)
at String.replace (native)
at camelize (/home/shawn/git/waltzapp/sequelize-troubleshooting/node_modules/sequelize/lib/utils.js:108:21)
at Object.camelizeIf (/home/shawn/git/waltzapp/sequelize-troubleshooting/node_modules/sequelize/lib/utils.js:32:14)
at new HasMany (/home/shawn/git/waltzapp/sequelize-troubleshooting/node_modules/sequelize/lib/associations/has-many.js:67:31)
at Function.hasMany (/home/shawn/git/waltzapp/sequelize-troubleshooting/node_modules/sequelize/lib/associations/mixin.js:26:25)
at Function.usersRoles.associate (/home/shawn/git/waltzapp/sequelize-troubleshooting/sequelize/models/usersRoles.js:71:23)
at Object.keys.forEach (/home/shawn/git/waltzapp/sequelize-troubleshooting/index.js:62:29)
at Array.forEach (native)
at Promise.map.then (/home/shawn/git/waltzapp/sequelize-troubleshooting/index.js:60:27)
Run Code Online (Sandbox Code Playgroud)
我从未见过 Sequelize,但您的错误如下:
TypeError: Cannot read property 'toUpperCase' of undefined
Run Code Online (Sandbox Code Playgroud)
它说of undefined我建议您的代码尝试将字符串转换为大写,但实际上,您的字符串为 null 并且转换 ( toUpperCase) 在 null 时失败。
也就是说,我toUpperCase在您提供的查询中没有看到,但是您有一行model:invitations- 这是否意味着您的查询正在作用于某些称为“邀请”的数据结构(表?)?
如果是这样,我会在那里检查该toUpperCase功能。对于该函数的每个实例,查看是否正在对可能具有 null 值的对象调用该函数。如果是这样,那么以某种方式确保您不会获得空值 - 例如,添加过滤条件以排除空值,或使用类似的转换函数isNull(如果它存在)或用coalesce空字符串替换空值,如下所示:
coalesce(columnName, '')
Run Code Online (Sandbox Code Playgroud)
如果上述操作失败,请发布更多有关您的数据查询实际情况的信息,以及您认为复合外键可能与该错误相关的原因。
| 归档时间: |
|
| 查看次数: |
3215 次 |
| 最近记录: |