【问题标题】:Mysql8 xdevapi node.js CRUD table.select problemsMysql8 xdevapi node.js CRUD table.select问题
【发布时间】:2019-02-16 19:20:10
【问题描述】:

让我们看看这个选择:

getSession(<connectionOptions>)
.then(s => { return s.getSchema('<schema>') } )
.then(s => { return s.getTable('<table>') } )
.then(t => t.select('*') // or .select('COUNT(*)')
.where('<where>')
.execute(row => myHandler(row, <other params>)));
//
function myHandler(row, <other params>) {
...
}

我有三个问题,在阅读https://dev.mysql.com/doc/x-devapi-userguide/en并搜索互联网后我没有找到任何东西:

  1. 如何查看和处理选择的结果集为空的情况?在 node.js xdevapi 实现中,我没有得到结果集,只有一个接一个的结果行,所以我想我的回调甚至没有被调用一次。
  2. 因为我的回调被多次调用,我不知道最后一次调用它是什么时候,即我什么时候从结果集中获得最后一行。如何查看和处理?
  3. COUNT(*) / * 在选择字符串中不被接受,这两种情况都会在 * 字符处引发意外标记错误。不过,这是标准 SQL。我可以看到我可以使用 session.sql('SELECT COUNT(*) FROM table') 但我很想知道为什么不在 CRUD 中呢?

【问题讨论】:

  • 您提供的链接返回“找不到页面”
  • 抱歉 /en 已添加到 URL 中并且显示正确

标签: mysql node.js


【解决方案1】:
  1. 您使用的是 Promise,而不是回调。所以在execute 之后添加then 会让你知道执行完成了。
  2. 一个选项是:在处理函数中,您可以根据需要推送到外部数组或简单计数器,当调用then时,您可以参考计数器来获取结果。第二个选项 - 基于this,看起来execute 之后的最后一个then 将解析所有结果作为数组。因此,如果您需要在获得所有结果后才采取行动,请不要在您的处理程序函数中添加任何内容,只需添加 then 并在那里执行您需要的操作。
  3. 看来您需要将其用作函数,例如 .then(t =&gt; t.count('*').then(t =&gt; t.select('*').count()

附:我从未使用过 xdevapi,它看起来很棒。如果您仅将其用于关系操作,我建议您查看knex

【讨论】:

  • 1.和 2. 在 .execute 之后使用 .then 解决(请参阅下面的完整调查结果)。谢谢。
  • 1.和 2. 在 .execute 之后使用 .then 解决(请参阅下面的完整调查结果)。对于 3. 我可以使用 .then 的解决方法。进一步的 t.count('*') 有效,但它不能有 .where 子句。谢谢。
  • 太棒了!没错,这里count 的代码github.com/mysql/mysql-connector-nodejs/blob/… 只是一个简单的查询,没有使用selectTable 处理程序。
  • 对原始答案的一些小的更正/扩展。关于第 1 点和第 2 点,execute() 有效地返回了 Promise,但是它并没有通过引用结果集数据来解决,这意味着您需要回调来处理这些数据和 then() 处理程序知道什么时候它结束。关于第 3 点,您可以使用像 select("COUNT('*')") 这样的文字。
【解决方案2】:

记录:

在 .execute 之后,您可以添加一个 .then,您可以在其中通过函数访问一些有用的信息(受影响的行、生成的 ID、警告等),当然您可以捕捉到执行的结束:

.execute() .then(info => myInfoHandler(info,<other params>) ... if (info.getAffectedRowsCount()==0) { //empty result set }

这样你就不需要 COUNT(*)。

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多