"error": "select * from `alliance` where `alliance_description` = {} - SQLITE_ERROR: no such table: alliance
"error": "select * from `alliance` where `alliance_description` = {} - SQLITE_ERROR: no such table: alliance
问题 =>“错误”:“select * 来自 alliance
其中 alliance_description
= {} - SQLITE_ERROR:没有这样的 table:联盟
$ npm run start:dev
> rest-api@1.0.0 start:dev D:\OSSE\back-end
> nodemon src/server.js
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node src/server.js`
migrations [ 2, [] ]
Listening on Port 5000!
sqlite does not support inserting default values. Set the `useNullAsDefault` flag to hide this warning. (see docs
http://knexjs.org/#Builder-insert).
GET /alliance 500 149.999 ms - 110
sqlite does not support inserting default values. Set the useNullAsDefault
flag to hide this warning. (see docs
http://knexjs.org/#Builder-insert).
GET /alliance 500 6.629 ms - 110
GET /favicon.ico 404 0.703 ms - 40
Knex.js 配置
const path = require('path')
require('dotenv').config()
const {
DATABASE_URL = 'postgresql://postgres@localhost/postgres',
} = process.env
module.exports = {
development: {
client: 'postgresql',
connection: DATABASE_URL,
pool: { min: 0, max: 100 },
migrations: {
directory: path.join(__dirname, 'src', 'db', 'migrations'),
},
seeds: {
directory: path.join(__dirname, 'src', 'db', 'seeds'),
},
useNullAsDefault: true,
},
production: {
client: 'postgresql',
connection: DATABASE_URL,
pool: { min: 0, max: 100 },
migrations: {
directory: path.join(__dirname, 'src', 'db', 'migrations'),
},
seeds: {
directory: path.join(__dirname, 'src', 'db', 'seeds'),
},
useNullAsDefault: true,
},
test: {
client: 'sqlite3',
connection: {
filename: ':memory:',
},
migrations: {
directory: path.join(__dirname, 'src', 'db', 'migrations'),
},
seeds: {
directory: path.join(__dirname, 'src', 'db', 'seeds'),
},
useNullAsDefault: true,
},
}
Knex 连接
const env = process.env.NODE_ENV || 'development'
const config = require('../../knexfile')[env]
const knex = require('knex')(config)
module.exports = knex
Alliance.controller
const service = require('./alliance.service')
const wrapper = require('../errors/asyncErrorBoundary')
const list = async (req, res, next) => {
const { alliance_description } = req.query
const data = await service.list(req.query)
if (alliance_description) {
const data = await service.list(alliance_description)
res.json({
data: alliance_description,
})
return
}
return res.json({ data })
}
function allianceExists(req, res, next) {
const allianceId = req.params.alliance_id
const foundAlliance = alliance.find(
(alliances) => alliances.id === alliance_id
)
if (foundAlliance) {
res.locals.dish = foundAlliance
return next()
}
next({
status: 404,
message: `Alliance ID ${allianceId} Doesn't Exist`,
})
}
function checkAllianceId(req, res, next) {
const allianceId = req.params.alliance_id
const id = req.body.data.id
if (allianceId !== id && id !== undefined && (id !== '') & (id !== null)) {
return next({
status: 400,
message: `Alliance ID does not match route id. Alliance: ${id}, Route: ${allianceId}`,
})
}
return next()
}
const update = async (req, res, next) => {
const { alliance_id } = req.params
const data = await service.update(alliance_id, req.body.data)
res.status(200).json({
data: data[0],
})
}
const create = async (req, res, next) => {
const newAlliance = res.locals.validAlliance
const newRes = await service.create(newAlliance)
res.status(201).json({ data: newRes[0] })
}
const show = async (req, res, next) => {
const data = await service.show()
return res.json({ data })
}
const read = async (req, res, next) => {
const alliances = res.locals.alliance
res.status(200).json({ data: alliance[0] })
}
const isValid = (req, res, next) => {
if (!req.body.data)
return next({ status: 400, message: 'No alliance selected' })
const { alliance_name, alliance_description } = req.body.data
const requiredFields = ['alliance_name', 'alliance_description']
for (const field of requiredFields) {
if (!req.body.data[field]) {
return next({ status: 400, message: `Invalid input for ${field}` })
}
}
res.locals.validAlliance = req.body.data
next()
}
const destroy = async (req, res) => {
const { alliance_id } = rq.params
const des = await service.destroy(alliance_id)
res.status(200)
}
module.exports = {
list: [wrapper(list)],
show: [wrapper(show)],
read: [wrapper(checkAllianceId), wrapper(allianceExists), wrapper(read)],
create: [wrapper(isValid), wrapper(create)],
update: [wrapper(isValid), wrapper(allianceExists), wrapper(update)],
destroy: [wrapper(destroy)],
}
Alliance.Router
const router = require('express').Router()
const controller = require('./alliance.controller')
const methodNotAllowed = require('../errors/methodNotAllowed')
router.route('/').get(controller.list).all(methodNotAllowed)
router
.route('/:allianceId')
.get(controller.list)
.post(controller.create)
.put(controller.update)
.all(methodNotAllowed)
router
.route('/:allianceId/:userId')
.get(controller.list)
.put(controller.update)
.delete(controller.destroy)
.all(methodNotAllowed)
module.exports = router
Alliance.service
const { default: knex } = require('knex')
const listAlliancesById = (knex, allianceId) =>
knex('alliances as a').where({ 'a.alliance_id': allianceId })
const list = (alliance_description) => {
return knex('alliance')
.select('*')
.from('alliance')
.where({ alliance_description: alliance_description })
// .orderBy('alliance_id')
}
const show = () => {
return knex('alliance').select('*')
}
const read = (alliance_id) => {
return knex('alliance').select('*').where({ alliance_id: alliance_id })
}
const create = (alliance) => {
return knex('alliance').insert(alliance, '*')
}
const update = (alliance_id, updatedAlliance) => {
return knex('alliance')
.where({ alliance_id: alliance_id })
.update(updatedAlliance)
.returning('*')
}
const destroy = (alliance) => {
return knex('alliance').delete(alliance).returning('*')
}
module.exports = {
list,
show,
read,
create,
listAlliancesById,
update,
destroy,
}
数据库查询
希望有人能帮我解决这个问题。
您收到来自 sqlite dbms 的错误:
SQLITE_ERROR: no such table: alliance"
肯定是你的应用程序连接到 sqlite 而不是 postgresql 服务器,它在那里找不到 table。
所以请查看您的 config/connection 字符串,找出您的 knex 应用程序从哪里读取数据库连接
我解决了:
const { default: knex } = require('knex')
const knex = require(../db/connection) // <==== ANSWER
// was missing out of the .service file
问题 =>“错误”:“select * 来自 alliance
其中 alliance_description
= {} - SQLITE_ERROR:没有这样的 table:联盟
$ npm run start:dev > rest-api@1.0.0 start:dev D:\OSSE\back-end > nodemon src/server.js [nodemon] 2.0.7 [nodemon] to restart at any time, enter `rs` [nodemon] watching path(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node src/server.js` migrations [ 2, [] ] Listening on Port 5000! sqlite does not support inserting default values. Set the `useNullAsDefault` flag to hide this warning. (see docs
http://knexjs.org/#Builder-insert). GET /alliance 500 149.999 ms - 110 sqlite does not support inserting default values. Set the
useNullAsDefault
flag to hide this warning. (see docs http://knexjs.org/#Builder-insert). GET /alliance 500 6.629 ms - 110 GET /favicon.ico 404 0.703 ms - 40
Knex.js 配置
const path = require('path') require('dotenv').config() const { DATABASE_URL = 'postgresql://postgres@localhost/postgres', } = process.env module.exports = { development: { client: 'postgresql', connection: DATABASE_URL, pool: { min: 0, max: 100 }, migrations: { directory: path.join(__dirname, 'src', 'db', 'migrations'), }, seeds: { directory: path.join(__dirname, 'src', 'db', 'seeds'), }, useNullAsDefault: true, }, production: { client: 'postgresql', connection: DATABASE_URL, pool: { min: 0, max: 100 }, migrations: { directory: path.join(__dirname, 'src', 'db', 'migrations'), }, seeds: { directory: path.join(__dirname, 'src', 'db', 'seeds'), }, useNullAsDefault: true, }, test: { client: 'sqlite3', connection: { filename: ':memory:', }, migrations: { directory: path.join(__dirname, 'src', 'db', 'migrations'), }, seeds: { directory: path.join(__dirname, 'src', 'db', 'seeds'), }, useNullAsDefault: true, }, }
Knex 连接
const env = process.env.NODE_ENV || 'development' const config = require('../../knexfile')[env] const knex = require('knex')(config) module.exports = knex
Alliance.controller
const service = require('./alliance.service') const wrapper = require('../errors/asyncErrorBoundary') const list = async (req, res, next) => { const { alliance_description } = req.query const data = await service.list(req.query) if (alliance_description) { const data = await service.list(alliance_description) res.json({ data: alliance_description, }) return } return res.json({ data }) } function allianceExists(req, res, next) { const allianceId = req.params.alliance_id const foundAlliance = alliance.find( (alliances) => alliances.id === alliance_id ) if (foundAlliance) { res.locals.dish = foundAlliance return next() } next({ status: 404, message: `Alliance ID ${allianceId} Doesn't Exist`, }) } function checkAllianceId(req, res, next) { const allianceId = req.params.alliance_id const id = req.body.data.id if (allianceId !== id && id !== undefined && (id !== '') & (id !== null)) { return next({ status: 400, message: `Alliance ID does not match route id. Alliance: ${id}, Route: ${allianceId}`, }) } return next() } const update = async (req, res, next) => { const { alliance_id } = req.params const data = await service.update(alliance_id, req.body.data) res.status(200).json({ data: data[0], }) } const create = async (req, res, next) => { const newAlliance = res.locals.validAlliance const newRes = await service.create(newAlliance) res.status(201).json({ data: newRes[0] }) } const show = async (req, res, next) => { const data = await service.show() return res.json({ data }) } const read = async (req, res, next) => { const alliances = res.locals.alliance res.status(200).json({ data: alliance[0] }) } const isValid = (req, res, next) => { if (!req.body.data) return next({ status: 400, message: 'No alliance selected' }) const { alliance_name, alliance_description } = req.body.data const requiredFields = ['alliance_name', 'alliance_description'] for (const field of requiredFields) { if (!req.body.data[field]) { return next({ status: 400, message: `Invalid input for ${field}` }) } } res.locals.validAlliance = req.body.data next() } const destroy = async (req, res) => { const { alliance_id } = rq.params const des = await service.destroy(alliance_id) res.status(200) } module.exports = { list: [wrapper(list)], show: [wrapper(show)], read: [wrapper(checkAllianceId), wrapper(allianceExists), wrapper(read)], create: [wrapper(isValid), wrapper(create)], update: [wrapper(isValid), wrapper(allianceExists), wrapper(update)], destroy: [wrapper(destroy)], }
Alliance.Router
const router = require('express').Router() const controller = require('./alliance.controller') const methodNotAllowed = require('../errors/methodNotAllowed') router.route('/').get(controller.list).all(methodNotAllowed) router .route('/:allianceId') .get(controller.list) .post(controller.create) .put(controller.update) .all(methodNotAllowed) router .route('/:allianceId/:userId') .get(controller.list) .put(controller.update) .delete(controller.destroy) .all(methodNotAllowed) module.exports = router
Alliance.service
const { default: knex } = require('knex') const listAlliancesById = (knex, allianceId) => knex('alliances as a').where({ 'a.alliance_id': allianceId }) const list = (alliance_description) => { return knex('alliance') .select('*') .from('alliance') .where({ alliance_description: alliance_description }) // .orderBy('alliance_id') } const show = () => { return knex('alliance').select('*') } const read = (alliance_id) => { return knex('alliance').select('*').where({ alliance_id: alliance_id }) } const create = (alliance) => { return knex('alliance').insert(alliance, '*') } const update = (alliance_id, updatedAlliance) => { return knex('alliance') .where({ alliance_id: alliance_id }) .update(updatedAlliance) .returning('*') } const destroy = (alliance) => { return knex('alliance').delete(alliance).returning('*') } module.exports = { list, show, read, create, listAlliancesById, update, destroy, }
数据库查询
希望有人能帮我解决这个问题。
您收到来自 sqlite dbms 的错误:
SQLITE_ERROR: no such table: alliance"
肯定是你的应用程序连接到 sqlite 而不是 postgresql 服务器,它在那里找不到 table。
所以请查看您的 config/connection 字符串,找出您的 knex 应用程序从哪里读取数据库连接
我解决了:
const { default: knex } = require('knex')
const knex = require(../db/connection) // <==== ANSWER
// was missing out of the .service file