gpt4 book ai didi

node.js - 使用 Sequelize 和 Postgres 从外键引用的另一个表中查询数据

转载 作者:行者123 更新时间:2023-12-03 22:21:39 25 4
gpt4 key购买 nike

我正在使用 Postrges 作为数据库构建 NextJs NodeJs Express 应用程序,我还在运行两台服务器并使用 axios 来获取和发布来自我的 api 端点的请求。

我有两个表:公司和银行,银行表中的主键在公司表中作为外键引用。公司只能拥有一家银行。

If I have a Bank table:
BankId Bank Name Account Number
1 New Bank 123456789

Company table:
CompanyId Company Name BankId
1 Newer Company 1

我想显示公司的数据:
Company Name: Newer Company
Bank Name: New Bank
Account Number: 123456789

这是我的文件:

公司型号:
模型/公司数据.js
const Sequelize = require ('sequelize');
const db = require('../config/database');
const bank = require('./bank');

const companyData = db.define('companyData', {
companyId: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
company_name: {
type: Sequelize.STRING
},
bankId: {
type: Sequelize.INTEGER,
references: {
model: 'bank',
key: 'bankId',
}
}
}, {
freezeTableName: true
})

bank.hasOne(companyData);

module.exports = companyData;

银行型号:
模型/bank.js
const Sequelize = require('sequelize');
const db = require('../config/database');

const Bank = db.define('bank', {
bankId: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
bank_name: {
type: Sequelize.STRING
},
account_number: {
type: Sequelize.BIGINT
}
}, {
freezeTableName: true
})

module.exports = Bank;

这是一个包含用于创建新公司的状态和输入字段的组件:
组件/新公司数据.js
import React from 'react';
import axios from 'axios';

class newCompanyData extends React.Component {

state = {
company_name: '',
bankId: '',
}

onChangeCompanyName = (e) => {
this.setState({
company_name: e.target.value
})
}

onChangeBankId = (e) => {
this.setState({
bankId: e.target.value
})
}

onSubmit = (e) => {
e.preventDefault()

axios.post('http://localhost:9000/api/company', {
company_name: this.state.company_name,
bankId: this.state.bankId,
})
.then(res => {
console.log(res);
}).catch(err => console.log(err))
}

onReset = (e) => {
this.setState({
company_name: '',
bankId: '',
})
}

render() {
return (
<div>
<form>
Company name:<br/>
<input type="text" name="companyname" onChange={this.onChangeCompanyName} value={this.state.company_name}></input><br/>
Bank Id:<br/>
<input type="number" name="bankid" onChange={this.onChangeBankId} value={this.state.bankId}></input><br/>
<br/>
<button type="submit" onClick={this.onSubmit}>Submit</button><br/>
<input type="button" value="Reset Form" onClick={this.onReset} />
</form>
</div>
)
}
}

export default newCompanyData;

然后我向这个 api 端点发送请求以创建一个表,如果它不存在或者只是填写新行:
路线/api/company.js
const express = require('express');
const router = express.Router();
const DB = require('../../config/database');
const companyData = require('../../models/companyData');

router.post('/', (req, res) => {
const data = req.body;

DB.sync().then(function() {
return companyData.create({
company_name: data.company_name,
bankId: data.bankId,
});
}).then(function () {
res.send(req.body);
console.log('Success!')
});
})

module.exports = router;

所以它确实创建了一个表并填充了所有数据,但是问题是当我想打印公司表中的所有数据时,包括来自 bankId 引用的银行表的数据:
页面/viewCompany.js
import React from 'react';
import axios from 'axios';

class listCompany extends React.Component {

state = {
data: []
}

componentDidMount = () => {
axios.get('http://localhost:9000/api/listcompany')
.then((response) => {
console.log(response.data);
this.setState({data: response.data.response})
}).catch(err => {
console.log(err);
});
}

render() {
return (
<div>
<h1>Company List</h1>
</div>
)
}
}

export default listCompany;

我向这个 API 端点发送了一个 get 请求,但它没有正确返回它:
路线/api/listcompany.js
const express = require('express');
const router = express.Router();
const Bank = require('../../models/bank');
const companyData = require('../../models/companyData');

router.get('/', (req, res) => {
companyData.findAll({
include: [{
model: Bank
}]}).then(function(response) {
console.log(response);
res.send({response});
}).catch(function(err){
console.log('Oops! something went wrong, : ', err);
});
})

module.exports = router;

我有一种感觉,我在模型阶段以及在发送查询时都没有很好地连接它。我感谢我能得到的所有帮助。谢谢。

最佳答案

const bank = require('./bank');

此语句不会正确导入银行模型。在 sequelize 中,为了从模型定义导入模型,您必须使用 sequelize.import( // path to file) 。为了正确导入模型,请使用以下内容:
const bank = sequelize.import('./bank');

注意: 这里 seuqelizeSequelize 的一个实例,而不是类本身。 seuqelize 变量是您使用类似的东西创建的数据库连接
const sequelize = new Sequelize(DB_NAME, DB_USERNAME, DB_PASSWORD, { ...options })

关于node.js - 使用 Sequelize 和 Postgres 从外键引用的另一个表中查询数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58422169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com