MariaDB在查询后取消选择数据库(NODEJS)

bvpmtnay  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(151)

我目前正在我的树莓上实现一个小的个人项目。我的web应用程序向我的后端发送一个POST请求,它查询数据库。第一次查询总是很好,但在第二次查询时,数据库不再被选中,我得到一个错误。作为证明,下图显示了两个连续的“SELECT DATABASE()”查询。

我将代码拆分为main、server和db文件,这样我的代码就干净了。

// db.js
require('dotenv').config();

const mariadb = require('mariadb');
const pool = mariadb.createPool({
     host: 'demez.asuscomm.com', 
     user: process.env.MARIADB_USER, 
     password: process.env.MARIADB_PW,
     connectionLimit: 5
});

// connect()
async function connect() {
    try {
        await pool.getConnection();
        // select default db
        await pool.query('USE athletepresencelist');
    } catch (err) {
        console.log(err);
    }
}

// query()
async function querydb(query) {
    try {
        // await pool.query('USE athletepresencelist');
        return await pool.query(query);
    } catch (err) {
        console.log(err);
    }
}

module.exports = {
    connect, querydb
}

正如您所看到的,当我连接到MariaDB时,我也选择了数据库,但是正如在db.js文件外使用'querydb()'函数进行第二次查询时所述,它取消了我之前选择的数据库。有什么建议吗?为什么要这样做,以及我如何修复它?我已经尝试在实际查询之前放置USE数据库,但它不起作用

zour9fqk

zour9fqk1#

问题

问题是连接池默认情况下不“使用”数据库。当创建数据库连接池时,它将创建一定数量的到数据库的连接,每个连接都有自己的状态。当在connect函数中执行USE database;时,它可能只在这些连接中的一个连接中运行,各种数据库池实现处理如何使用连接,但可以安全地假设这就是这里正在发生的事情。

溶液

通过修改连接到数据库的方式,可以很容易地解决此问题:

// db.js
require('dotenv').config();

const mariadb = require('mariadb');
const pool = mariadb.createPool({
     host: 'demez.asuscomm.com', 
     database: 'athletepresencelist',
     user: process.env.MARIADB_USER, 
     password: process.env.MARIADB_PW,
     connectionLimit: 5
});

// connect()
async function connect() {
    try {
        await pool.getConnection();
    } catch (err) {
        console.log(err);
    }
}

// query()
async function querydb(query) {
    try {
        return await pool.query(query);
    } catch (err) {
        console.log(err);
    }
}

module.exports = {
    connect, querydb
}
  • 这里需要注意的一点是,这假定在连接到数据库之前,数据库已经存在。*

相关问题