在这里,我们将给大家分享关于在Nodejs应用程序内的Postgres查询中转义单引号的知识,让您更了解nodejs获取post数据的本质,同时也会涉及到如何更有效地node.js–Mongodb对N
在这里,我们将给大家分享关于在Node js应用程序内的Postgres查询中转义单引号的知识,让您更了解nodejs获取post数据的本质,同时也会涉及到如何更有效地node.js – Mongodb对Node.js应用中的Postgres、node.js – node-postgres:从postgres CLI发出NOTIFY作业不起作用、node.js – 使用brianc / node-postgres批量插入Postgres、node.js – 具有大量查询的node-postgres的内容。
本文目录一览:- 在Node js应用程序内的Postgres查询中转义单引号(nodejs获取post数据)
- node.js – Mongodb对Node.js应用中的Postgres
- node.js – node-postgres:从postgres CLI发出NOTIFY作业不起作用
- node.js – 使用brianc / node-postgres批量插入Postgres
- node.js – 具有大量查询的node-postgres
在Node js应用程序内的Postgres查询中转义单引号(nodejs获取post数据)
这是我的节点js代码中的一行:
var qry = ''INSERT INTO "sma"."RMD"("UserId","Favourite") VALUES ('' + req.body.user + '','' + JSON.stringify(req.body.favourite) + '')''
我想在之前插入单引号JSON.stringify(req.body.favourite)
。但我无法转义单引号。因为我将代码上传到predix云服务器,所以无法调试问题。如何实现该想法?
答案1
小编典典您为什么不使用准备好的语句?
var qry = ''INSERT INTO "sma"."RMD"("UserId","Favourite") VALUES ($1, $2)'';client.query(qry, [ req.body.user, JSON.stringify(req.body.favourite])''
node.js – Mongodb对Node.js应用中的Postgres
我不是一个数据库专家,所以我不能告诉我的生活的方式去。如果你能给出一些建议,考虑哪一个和为什么,我真的apreaciate。
我有几个标准:
>因为我想这是一个例子,这将是很高兴有一个方法来托管一个规模大小的数据量。我知道mongodb defiantly提供这一点,但postgres帕拉像heroku似乎有很小的数据库(因为我记录每个访问者的网站)
>一个简单的数据库,很容易向他人解释。
>性能并不重要,但速度不能伤害
感谢所有的帮助!
注:请不要火焰大战,大家有自己的看法:)
解决方法
Nosql有一个小组的用例,其中数据存储在称为文档的大型紧密耦合的包中,而不是在关系模型中。简而言之,紧密耦合到单个实体(如单个用户使用的所有文本文档)的数据更好地存储在Nosql文档模型中。数据行为像excel电子表格,并适合行在行和受聚合计算更好地存储在一个sql数据库,其中postgresql只是几个好的选择之一。
您可能考虑的第三个选项是redis(http://redis.io/),这是一个简单的键值数据存储,当查询像sql但不是刚性类型时,它非常快。
你举的例子似乎是一个简单的行/列类型问题。您会发现sql语法比MongoDB的查询语法少得多。 Node有很多东西可以推荐它,并且工具集在过去一年里已经显着成熟。我建议使用monogoose npm包,因为它减少了本地mongodb所需的样板代码的数量,我没有注意到任何性能下降。
http://slashdot.org/topic/bi/sql-vs-nosql-which-is-better/
http://www.infoivy.com/2013/07/nosql-database-comparison-chart-only.html
node.js – node-postgres:从postgres CLI发出NOTIFY作业不起作用
从postgres CLI我发出一个
NOTIFY job;
Postgres正确引发了通知(我可以在PHP客户端中看到它),
但无法在节点中读取它.
JS:
var pg = require('pg'); var conString = "your postgres information"; var client = new pg.Client(conString); client.connect(); client.query('LISTEN job'); client.on('notification',function(msg) { console.log('data'); });
我宁愿保持简单.是制作的唯一方法
postgres中的程序如this?
解决方法
var conString = "tcp://user:pass@localhost/db";
检查您是否使用正确的数据库来访问通知消息非常重要.
node.js – 使用brianc / node-postgres批量插入Postgres
我为员工创建订阅的代码就是这样.
client.query( 'INSERT INTO subscriptions (subscription_guid,employer_guid,employee_guid) values ($1,$2,$3)',[ datasetArr[0].subscription_guid,datasetArr[0].employer_guid,datasetArr[0].employee_guid ],function(err,result) { done(); if (err) { set_response(500,err,res); logger.error('error running query',err); return console.error('error running query',err); } logger.info('subscription with created'); set_response(201); });
您已经注意到datasetArr是一个数组.我想一次为多个员工创建大量订阅.但是我不想循环遍历数组.有没有办法用pg开箱即用?
解决方法
使用异步库,可以非常简单地多次使用查询,并进行必要的错误处理.
可能是这个代码变体有帮助.
(用于将10.000个小json对象插入空数据库,花费6秒).
克里斯托夫
function insertData(item,callback) { client.query('INSERT INTO subscriptions (subscription_guid,employee_guid) values ($1,[ item.subscription_guid,item.employer_guid,item.employee_guid ],result) { // return any err to async.each iterator callback(err); }) } async.each(datasetArr,insertData,function(err) { // Release the client to the pg module done(); if (err) { set_response(500,res); logger.error('error running query',err); return console.error('error running query',err); } logger.info('subscription with created'); set_response(201); })
node.js – 具有大量查询的node-postgres
我注意到,有一段时间(少于10秒),我开始得到“错误:连接终止”.我不知道这是如何使用节点postgres,或者是因为我是垃圾邮件postgres问题.
无论如何,这里是一个简单的代码,显示这个行为:
var pg = require('pg'); var connectionString = "postgres://xxxx:xxxx@localhost/xxxx"; pg.connect(connectionString,function(err,client,done){ if(err) { return console.error('Could not connect to postgres',err); } client.query("DROP TABLE IF EXISTS testDB"); client.query("CREATE TABLE IF NOT EXISTS testDB (id int,first int,second int)"); done(); for (i = 0; i < 1000000; i++){ client.query("INSERT INTO testDB VALUES (" + i.toString() + "," + (1000000-i).toString() + "," + (-i).toString() + ")",result){ if (err) { return console.error('Error inserting query',err); } done(); }); } });
约18,000-20,000次查询失败.这是使用client.query的错误方式吗?我尝试更改默认客户端号码,但似乎没有帮助.
client.connect()似乎也没有帮助,但那是因为我有太多的客户端,所以我绝对认为客户端池是要走的路.
感谢任何帮助!
解决方法
下面是一个修改的方法,我们将插入块分成块,然后在事务中执行每个块,这是负载平衡(也称为节流):
function insertRecords(N) { return db.tx(function (ctx) { var queries = []; for (var i = 1; i <= N; i++) { queries.push(ctx.none('insert into test(name) values($1)','name-' + i)); } return promise.all(queries); }); } function insertAll(idx) { if (!idx) { idx = 0; } return insertRecords(100000) .then(function () { if (idx >= 9) { return promise.resolve('SUCCESS'); } else { return insertAll(++idx); } },function (reason) { return promise.reject(reason); }); } insertAll() .then(function (data) { console.log(data); },function (reason) { console.log(reason); }) .done(function () { pgp.end(); });
在大约4分钟内产生了1000,000条记录,在前3次交易之后大幅放缓.我正在使用节点JS 0.10.38(64位),消耗大约340MB的内存.这样我们插入了10万条记录,连续10次.
如果我们这样做,只有这一次在100个事务中插入10,000个记录,在1个25分钟内添加相同的1,000,没有减慢,Node JS消耗大约100MB的内存,这告诉我们这样的分区数据是非常好主意.
使用哪个图书馆并不重要,方法应该是一样的:
>分割/将您的插入调整为多个事务;
>将单个事务中的插入列表保留在大约10,000条记录中;
>在同步链中执行所有交易.
>在每个事务的COMMIT之后释放连接回到池.
如果你违反了这些规则,那么你是有保障的.例如,如果您打破规则3,您的Node JS进程可能会快速运行内存,并抛出错误.我的例子中的规则4由图书馆提供.
如果您遵循这种模式,您不需要使用连接池设置来解决问题.
更新1
pg-promise的更新版本完美支持这样的场景,如下图所示:
function factory(index) { if (index < 1000000) { return this.query('insert into test(name) values($1)','name-' + index); } } db.tx(function () { return this.batch([ this.none('drop table if exists test'),this.none('create table test(id serial,name text)'),this.sequence(factory),// key method this.one('select count(*) from test') ]); }) .then(function (data) { console.log("COUNT:",data[3].count); }) .catch(function (error) { console.log("ERROR:",error); });
如果你不想添加任何额外的东西,如表创建,那么它看起来更简单:
function factory(index) { if (index < 1000000) { return this.query('insert into test(name) values($1)','name-' + index); } } db.tx(function () { return this.sequence(factory); }) .then(function (data) { // success; }) .catch(function (error) { // error; });
详见Synchronous Transactions.
例如,使用Bluebird作为承诺库,我的生产机器需要1m43,以插入1,000条记录(不启用长堆栈跟踪).
你可以根据索引让你的工厂方法返回请求,直到你没有剩下,简单的.
而最好的部分,这不仅仅是快速,而且对您的NodeJS进程造成了很小的负担.内存测试过程在整个测试期间保持在60MB以下,仅占cpu时间的7-8%.
更新2
从1.7.2版开始,pg-promise轻松支持超大规模的交易.参见第Synchronous Transactions章.
例如,我可以在我的家庭电脑,Windows 8.1 64位的15分钟内,在一个事务中插入10,000条记录.
对于测试,我将PC设置为生产模式,并使用Bluebird作为承诺库.在测试期间,对于整个NodeJS 0.12.5进程(64位),内存消耗没有超过75MB,而i7-4770 cpu显示出一致的15%负载.
以相同的方式插入100m记录将需要更多的耐心,但不会更多的计算机资源.
与此同时,以前的1m插入测试从1m43s降至1m31s.
更新3
以下考虑可以产生巨大的区别:Performance Boost.
更新4
相关问题,有较好的实施例子:
Massive inserts with pg-promise.
今天关于在Node js应用程序内的Postgres查询中转义单引号和nodejs获取post数据的讲解已经结束,谢谢您的阅读,如果想了解更多关于node.js – Mongodb对Node.js应用中的Postgres、node.js – node-postgres:从postgres CLI发出NOTIFY作业不起作用、node.js – 使用brianc / node-postgres批量插入Postgres、node.js – 具有大量查询的node-postgres的相关知识,请在本站搜索。
本文标签: