Javascript Sequelize findOne/findAll查询不返回关联属性
我正在尝试使用Sequelize获取一个基本的关联/联接查询,但似乎无法获取从包含关联返回的数据。到目前为止,我已经尝试了多种方法,但都无济于事,但目前正在使用以下方法(简化为演示):Javascript Sequelize findOne/findAll查询不返回关联属性,javascript,node.js,postgresql,sequelize.js,Javascript,Node.js,Postgresql,Sequelize.js,我正在尝试使用Sequelize获取一个基本的关联/联接查询,但似乎无法获取从包含关联返回的数据。到目前为止,我已经尝试了多种方法,但都无济于事,但目前正在使用以下方法(简化为演示): //package.json { ... “依赖项”:{ “pg”:“^7.18.1”, “pg hstore”:“^2.3.3”, “续集”:“^5.21.4” } } //sequelize.js const Sequelize=require('Sequelize') 常量选项={ ... databas
//package.json
{
...
“依赖项”:{
“pg”:“^7.18.1”,
“pg hstore”:“^2.3.3”,
“续集”:“^5.21.4”
}
}
//sequelize.js
const Sequelize=require('Sequelize')
常量选项={
...
databaseVersion:'8.0.2',//红移Postgres版本
方言:“postgres”,
选择:{
ssl:{
要求:对,
拒绝:对
}
}
定义:{
时间戳:false,
冻结表名称:true
}
}
const sequelize=新的sequelize(、选项)
module.exports=sequelize
//modelA.model.js
const{DataTypes}=require('sequelize')
const sequelize=require(“./sequelize”)
const schema='my_schema'
const tableName='my_table_a'
常量modelName='ModelA'
常量属性={
型号a键:{
类型:DataTypes.CHAR(32)
},
模型值:{
类型:DataTypes.STRING
}
型号b_键:{
类型:DataTypes.CHAR(32)
},
}
常量选项={
模式
对应表名
}
sequelize.define(模型名、属性、选项)
//modelB.model.js
const{DataTypes}=require('sequelize')
const sequelize=require(“./sequelize”)
const schema='my_schema'
const tableName='my_table_b'
常量modelName='ModelB'
常量属性={
型号b_键:{
类型:DataTypes.CHAR(32)
},
模型b_值:{
类型:DataTypes.STRING
}
}
常量选项={
模式
对应表名
}
sequelize.define(模型名、属性、选项)
//associations.js
const{models}=require('./sequelize.js')
belongsTo(models.ModelB,{foreignKey:'model_b_key'})
//我暂时忽略了这一点,因为我甚至不能正确地利用上面的关联。。。
//belongsTo(models.ModelA,{foreignKey:'model_b_key'})
按照sequelize、models和associations的顺序加载上述文件。在我看到的Sequelize示例之后,我尝试通过以下查询访问ModelA及其关联ModelB的数据:
//尝试#1
等待sequelize.models.ModelA.findOne({include:['ModelB']})
//返回的数据={model_a_key,model_a_value,model_b_key};缺少所有ModelB列
//尝试#2
等待sequelize.models.ModelA.findOne({attributes:['ModelB.model\u b_value'],include:['ModelB']})
//返回的数据={}
//尝试#3
等待sequelize.models.ModelA.findOne({include:[{association:'ModelB',required:true}]})
//返回的数据={model_a_key,model_a_value,model_b_key};缺少所有ModelB列
//尝试#4
等待sequelize.models.ModelA.findOne({include:[{association:'ModelB',attributes:['model_b_值']}]))
//返回的数据={model_a_key,model_a_value,model_b_key};缺少模型_b_值
生成的SQL似乎在实际获取感兴趣的列方面得到验证,例如,尝试#1产生:
选择“ModelA”。“model_a_key”,“ModelA”。“model_a_value”,“ModelA”。“model_b_key”,“ModelB”。“model_b_key”作为“ModelB.model_b_key”,“ModelB”。“model_b_value”作为“ModelB.model_b_value”
从“my_schema”,“my_table_a”作为“ModelA”
左侧外部联接“my_schema”。“my_table_b”作为“ModelA”上的“ModelB”。“model_b_key”=“ModelB”。“model_b_key”
限值1;
如果我设置选项raw:true
,这些值也可用。但是,如果我尝试使用model对象,则有关关联ModelB的所有信息似乎都会丢失/丢弃,ModelB
的嵌套对象和ModelB.model\u\u key
,ModelB.model\u\u值
都不存在于返回的对象上
我是不是错过了一些非常简单的东西?一直在拼命地摆弄关联targetKey
,sourceKey
,foreignKey
值,以及更多类似上面列出的findOne/findAll查询排列,但运气不佳
任何建议都将不胜感激
更新I
在进行了更多的修改之后,在建立关联时,似乎出现了一些区分大小写的奇怪行为。如果我将别名的关联定义为:“modelb”
,并通过关联:“modelb”
进行查询,则上述fetch语句将按预期工作,并将所需的modelb属性映射到返回的对象上。在别名中引入任何大写字符似乎都会破坏此功能-例如,将别名设置为xxxxxx
效果良好,xxxxxx
会导致上述原始问题
最直接的解决办法似乎是将所有内容都仅用小写字母进行别名,但我仍然希望按照预期工作。我希望这只是与Postgres和我的Sequelize配置有关,而不是实际问题
更新II
因此,似乎所有的大写列引用/别名都表示为已定义(例如,选择“ModelB”,“model\u b\u key”表示为“ModelB.model\u b\u key”
)在构造的SQL查询中,pg
客户端返回的行对象属性返回为小写(例如,行['ModelB.model\u\u key']
)。因此,字段标签不再与其原始关联标签对齐,并且没有任何数据映射到模型实例
设置Sequelize选项minifyAlias:true
似乎可以解决这个问题。启用此选项后,列别名在查询中表示为\u 01
、\u 02
等,然后映射回各自的字符串标签,避免了别名被无意中转换为