【问题标题】:knex always returns the same results from queryknex 总是从查询中返回相同的结果
【发布时间】:2021-06-02 13:22:57
【问题描述】:

尝试创建一个搜索功能,该功能将搜索数据库并返回任何“类似”字符串的结果。当我使用 SQL 调用数据库时,它工作正常,但是当我尝试使用 knex 调用时,我得到 0 个结果,或者无论我将字符串更改为什么结果都是相同的。

sql(工作)

 SELECT * FROM stockList WHERE symbol LIKE '%AAPL%' AND sec_type = 'stock';

我正在使用 req.params 来调用 knex 函数。可以更改的两件事是“sec_type”和“symbol”

路线

    app.get('/api/getStockList/:nameType/:queryParams', requireLogin, async (req, res, next) => {

        const {nameType, queryParams} = req.params;
        
        //Call Search Function 
        const searchData = await Search.searchSymbols(nameType, queryParams);
        res.send(searchData)
    })

knex函数

//Connect to Database
const knex = require('knex')({
  client: 'mysql',
  connection: {
    host: 'localhost',
    user: 'admin',
    password: keys.MysqlPassword,
    database: 'csv_stock_data',
  },
});

//Create knex function
exports.searchSymbols = async (search = '', sec_type) => {
  console.log(search + sec_type)

  //If No type selected Default is All
  if (sec_type === 'All') {
    const results = await knex('stockList')
        .select({
            symbol: 'symbol',
            displaySymbol: 'displaySymbol',
            description: 'description',
            sec_type: 'sec_type',
        })
        .where('symbol', 'like', `%${search.toUpperCase()}%`)
        // .orWhere('description', 'like', `%${search}%`);
        console.log(results)
    return results.map((row) => {
        return row;
      });
  } else {
    //else return data by type
    const results = await knex('stockList')
        .select({
            symbol: 'symbol',
            displaySymbol: 'displaySymbol',
            description: 'description',
            sec_type: 'sec_type',
        })
        .where('sec_type', sec_type)
        .where('symbol', 'like', `%${search.toUpperCase()}%`)
        // .orWhere('description', 'like', `%${search.toUpperCase()}%`);
    return results.map((row) => {
        return row;
    });
  }
};

【问题讨论】:

  • 使用 DEBUG=knex:* 环境变量集运行您的应用程序,您将看到发送的查询是否真的是您认为的那样。

标签: mysql node.js knex.js


【解决方案1】:

给定你想要的 SQL 语句,我可以用类似的东西到达那里:

knex('stockList')
    .select()
    .where('symbol', 'like', `%${'foobar'.toUpperCase()}%`)
    .where('sec_type', 'stock')

产生语句:

select * from "stockList" where "symbol" like '%FOOBAR%' and "sec_type" = 'stock'

您可以在这里试验这个确切的查询:QueryLab

您需要将您的variable 放回原处,我将'foobar' 字符串用于测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多