Articles of sql

Node.js SQL争用条件

我想知道在执行IO时如何防止NodeJS中的竞争条件。 我一直在阅读,大家坚持认为竞争条件是不可能的,因为NodeJS是单线程的。 让我们看看下面的伪代码: async decreaseUserBalance(userId, amount) { const currentBalance = await sql.queryScalar('SELECT balance FROM user WHERE userid=?', [userId]); await sql.query('UPDATE user SET balance = ? WHERE userid = ?', [currentBalance – amount, userId]); } 假设数据库节点连接到负载较重,并且需要一些时间来完成每个请求,并且每次用户点击某个项目上的购买button时都会调用该函数。 当用户开始发送这个button或者让机器人发送购买请求时会发生什么? 在我的理解,第一个请求将执行SELECT查询,并恢复执行。 现在,由于用户正在垃圾邮件button,下一个请求进来,执行相同的function。 现在你有几个SELECT语句正在等待完成。 现在,几个select语句完成执行并执行callback,因此现在有几个callback函数正在执行UPDATE语句,所有语句都具有相同的余额。 这意味着,如果起始余额为5,那么所有这些数额都会从最后一个已知余额中减less。 所以基本上不pipe你同时执行这个查询的频率如何,第一批请求都将从SELECT查询中获得相同的值,并将其更新为一些假的。 对不起,如果我的解释有点模糊,但我认为这是一个非常现实的问题,我怀疑有很多人考虑。 所以要解决这个问题,Node是否支持类似互斥的东西? 从我读过的MongoDB不支持表锁,所以locking只能是SQL的一个选项。 编辑: 我知道我可以在1个查询中完成这个例子,这将解决它,但让我们说这是不可能的。 那你怎么解决呢? 编辑2: 好的,让我们看看这个例子: async tryBuyItem(userId, itemId, price) { […]

格式化date时,NodeJS小时内的SQL查询处于closures状态

我想在我的查询中SELECT FORMAT(MAX(dTime),'yyyy-MM-dd hh:mm:ss') FROM triangulations dtime2字段: SELECT FORMAT(MAX(dTime),'yyyy-MM-dd hh:mm:ss') FROM triangulations 这给出了输出{result:[{'':'03:34:30'}],rowcount:1} 小时数应该是15.当查询格式不存在时,这也会显示出来。 查询: SELECT MAX(dTime) FROM triangulations给出输出: {result:[{'':Mon Jul 17 2017 15:34:30 GMT + 0000(Coordinated Universal Time)}],rowcount:1} 我使用库node-mssql-connector在NodeJs中执行查询。 为什么SQL给我错误的时间?

为什么基于“DATE”的“WHERE”子句失败?

我正在使用node.js连接到SQL数据库(特别是SQL Server 2016)。 我的表,名为transactionCounts,具有以下表和数据types: staff_id: varchar(50), date: Date, count: int; 为了清楚起见,“date”字段只是一个date,而不是date时间。 logging看起来像这样:“2017-08-07” 我正在使用mssql包, const sql = require('mssql'); 所以基本上,我有一个函数接受开始date和结束date,并与他们做这个: function(start, end) { let ps = new sql.PreparedStatement(transactionRegisterSqlPool); ps.input('start', sql.Date); ps.input('end', sql.Date); ps.prepare('SELECT staff_id, SUM(Count) TotalCount FROM [TransactionRegister].[dbo].[transactionCounts] ' + 'WHERE date >= @start AND date < @end GROUP BY staff_id', err => { .execute({start: start, end: […]

如何在NoSQL和SQL之间进行select?

我的问题是,我想学习nodejs / express,并做一个超级简单的Web项目。 这将是一个数据库与表:用户,video_games,类别。 该网站将只显示游戏列表(只是一个例子)。 在这种典型的情况下,什么会更有效:Mysql或MongoDB(SQL或NoSql)?

使用bookshelfjs通过相关的表格列来sorting结果

我有两个表,我正在使用'withRelated'与bookshelfjs查询。 如何按相关表中的列对结果进行sorting? 例如,我想通过rankingLinks.id来排列所有的结果 .fetchAll({withRelated: ['tickerSymbolLinks.tickerSymbol', 'rankingLinks', 'logoLinks.logo']}) 看起来很简单,但把我的头撞在了墙上。

如何使用node.js在mySQL中插入多个logging

我有一个查找表: CREATE TABLE technologies ( technologyName VARCHAR(50) NOT NULL PRIMARY KEY ); 我想为这个数组中的每个元素存储一个新的logging: var values = ['Grunt', 'Gulp']; 所以,结果表如下所示: +—————-+ | technologyName | +—————-+ | Grunt | +—————-+ | Gulp | +—————-+ 我怎样才能做到这一点使用节点? 更新: 我知道我可以做这样的事情: var values = [ [ ['Grunt'], ['Something'] ] ] connection.query('INSERT IGNORE INTO technologies (technologyName) VALUES ?', values); 我试过这与原始数组,但它不起作用。 我怎样才能将简单的数组转换成更复杂的数组?

没有时区的时间戳,date/时间字段值超出范围:

我得到错误{ [error: date/time field value out of range: "1439728672"] .. 我使用没有时区的时间戳列和执行像下面的查询使用CURRENT_TIMESTAMP我做到了在另一个数据库/表成功我不知道为什么? 柱 "CreateDate" timestamp without time zone, … nodejs postgres var query = 'INSERT INTO "Article" ("Content","CreateDate") VALUES ($1,CURRENT_TIMESTAMP) RETURNING "ArticleId"'; dbClient.query(query,[content], function(error, result) { });

列是不带时区的时间戳types,但expression式的types是整数

我得到像下面的错误信息,当我创build这个表就像其他人设置列时间戳timestamp without time zone NOT NULL ,但是当我试图插入2015-08-16 18:51:05到这张表,然后我得到错误,但其他表是工作,为什么以及如何解决呢? CREATE TABLE IF NOT EXISTS "UserForgetPasswordPending"( "UserForgetPasswordPendingId" SERIAL NOT NULL, "Email" varchar(50) NOT NULL, "TokenTimestamp" timestamp without time zone NOT NULL, "Token" varchar(100) NOT NULL, PRIMARY KEY ("UserForgetPasswordPendingId") ); ALTER TABLE "UserForgetPasswordPending" OWNER TO db_admin; 错误 [error: column "TokenTimestamp" is of type timestamp without time zone but […]

什么是防止node-mysql中的SQL注入的最佳实践?

关于这个主题已经有了一些讨论(例如, 在Node.js中阻止SQL注入 ),但是没有明确的清晰度或深入的讨论,更不用说在任何地方都有很好的文档了。 node-mysql文档讨论防止SQL注入和一些转义函数。 但是,目前还不清楚这些函数如何防止SQL注入。 手册说“string安全地逃脱了”。 没有更多…是仅限于逃脱一些字符? 在node-mysql中似乎还有其他一些与connection.escape和pool.escape中的函数相同的函数,并且再次强调了这些函数用于防止SQL注入。 在node-mysql中似乎也不支持真正的准备语句。 这个计划和文件再次不清楚。 Node-mysql显然是node.js环境中非常受欢迎的模块,至less在我有限的经验中是相当稳定的。 什么是防止在node-mysql中进行SQL注入的最佳实践?

在节点js mysql查询中删除斜杠

这是我的代码。 pool.getConnection(function (err, connection) { connection.query("delete from userFiles where type = 1 and typeId = " + taskId + " and fileName NOT IN ('?') ",[oldFileNames], function (err, rows) { }); }); 现在问题是,节点js正在这样生成查询, delete from table_name where type = 1 and typeId = 1 and fileName NOT IN (\'\'upload_149f2b78e5fd4096781bb5b8719b874f.png,upload_e8185e896cb0f8bb0b66d807cc60922c.png\'\') 我甚至尝试过这样 connection.query("delete from userFiles where type […]