Mysql8 xdevapi node.js CRUD table.select问题

时间:2019-02-16 19:20:10

标签: mysql node.js

让我们看看这个选择:

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. 因为我的回调被多次调用,所以我不知道何时最后一次调用它,即何时从结果集中获取最后一行。如何查看和处理它?<​​/ li> 在两种情况下,选择字符串中均不包含
  3. COUNT(*)/ *并在*字符上引发意外的令牌错误。不过,这是标准的SQL。我可以看到可以使用session.sql('SELECT COUNT(*)FROM table'),但我很好奇为什么不使用CRUD?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

记录:

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

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

这样,您不需要COUNT(*)。