我在SQL数据库工作了大约20年,似乎无法理解Knex映射查询的方式.有人可以帮我找到正确的代码吗?
我有这个SQL查询,我想在我的nodejs应用程序中使用:
SELECT p.id, p.project_number, p.project_name, p.start_date, p.end_date,
o.name, o.email_addr,
c.company, c.email_addr AS company_email, c.first_name, c.last_name
FROM projects p
INNER JOIN owners o ON o.id = p.owner_id
INNER JOIN clients c ON c.id = p.client_id
Run Code Online (Sandbox Code Playgroud)
KnexJS(0.7.5)文档显示了对我的查询看起来像这样的示例:
knex.from('projects').innerJoin('owners', 'owners.id', 'projects.owner_id')
.innerJoin('clients', 'clients.id', 'projects.client_id');
Run Code Online (Sandbox Code Playgroud)
我在文档中找不到几件事:
1)如何选择要包含的列?项目,客户和业主每个都有20到50列,我对所有这些都不感兴趣.从主表中选择列是明确的(使用select()或column())但是如何从连接表中选择列?
2)有些列具有相同的名称.如何避免名称冲突(即向其他表中的列添加一些前缀)?我查看了Knex可以生成列别名(... AS ...)的方式,我不确定它是否是更复杂查询的可行选项.(即使是像上面这样的相对简单的查询)
我正在写一个小文本文件(~500B),但奇怪的是,如果我使用fs.writeFile(..)(或WriteableStream的write/end方法)等异步方法编写,我会得到一个空文件.
这有效:
var scanInfo = getScanInfo( core ); // returns several lines delimited by \r\n
fs.writeFileSync( filename, scanInfo, 'ascii' );
Run Code Online (Sandbox Code Playgroud)
这会创建空文件,回调函数永远不会产生任何输出:
var scanInfo = getScanInfo( core );
scanInfo.push('') ;
scanInfo = scanInfo.join(DOS_CRLF);
fs.writeFile( filename, scanInfo, 'ascii', function ( err ) {
if(err) { console.error('Failed'); console.error(err) ; }
else { console.log('OK'); }
});
Run Code Online (Sandbox Code Playgroud)
我正在寻找类似的帖子,但在我发现问题是其他的东西(调用另一个函数返回内容)但我的内容是一个文本字符串(通过调试验证).
类似的帖子:fs.writeFile()不返回回调
平台> Win8.1 x64
NodeJS> x64 0.12.0
PS使用实际编写文件的函数的应用程序使用回调以"plain nodejs"样式编写,但由于它变得更复杂,我使用Q和Q-IO重写了主处理流.所以现在处理开始如下:
(在主模块中)
var qfs = require('q-io/fs') ;
...
qfs.read( configFile )
.then( doSomeConfig )
.then( function( config ) …Run Code Online (Sandbox Code Playgroud)